一个用于压平嵌套对象的衬垫

新手上路,请多包涵

我需要展平嵌套对象。需要一个班轮。不确定此过程的正确术语是什么。我可以使用纯 Javascript 或库,我特别喜欢下划线。

我有 …

 {
  a:2,
  b: {
    c:3
  }
}

而且我要 …

 {
  a:2,
  c:3
}

我试过了 …

 var obj = {"fred":2,"jill":4,"obby":{"john":5}};
var resultObj = _.pick(obj, "fred")
alert(JSON.stringify(resultObj));

哪个有效,但我也需要这个才能工作…

 var obj = {"fred":2,"jill":4,"obby":{"john":5}};
var resultObj = _.pick(obj, "john")
alert(JSON.stringify(resultObj));

原文由 danday74 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 301
2 个回答

干得好:

 Object.assign({}, ...function _flatten(o) { return [].concat(...Object.keys(o).map(k => typeof o[k] === 'object' ? _flatten(o[k]) : ({[k]: o[k]})))}(yourObject))

摘要:递归地创建一个单属性对象数组,然后将它们与 Object.assign 组合起来。

这使用了 ES6 功能,包括 Object.assign 或扩展运算符,但重写应该很容易而不需要它们。

对于那些不关心单行的疯狂并且更愿意能够实际阅读它的人(取决于您对可读性的定义):

 Object.assign(
  {},
  ...function _flatten(o) {
    return [].concat(...Object.keys(o)
      .map(k =>
        typeof o[k] === 'object' ?
          _flatten(o[k]) :
          ({[k]: o[k]})
      )
    );
  }(yourObject)
)

原文由 user663031 发布,翻译遵循 CC BY-SA 4.0 许可协议

简化的可读示例,没有依赖关系

/**
 * Flatten a multidimensional object
 *
 * For example:
 *   flattenObject{ a: 1, b: { c: 2 } }
 * Returns:
 *   { a: 1, c: 2}
 */
export const flattenObject = (obj) => {
  const flattened = {}

  Object.keys(obj).forEach((key) => {
    const value = obj[key]

    if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
      Object.assign(flattened, flattenObject(value))
    } else {
      flattened[key] = value
    }
  })

  return flattened
}

特征

原文由 Webber 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题