【问题标题】:Partially flattening a JavaScript object部分展平 JavaScript 对象
【发布时间】:2018-04-27 12:01:30
【问题描述】:

我有一个无法修改的 API 接收到的 JavaScript 对象。我想在工具中使用这些数据,但该工具只接受存储在对象根级别的值,例如我不能使用点表示法来访问下一级键的值。

根据下面的示例,我希望能够访问 shape.colour,但通过引用类似 shape__colour 的东西,而不是从新的 JSON 对象。

示例起始对象:

[{
  "id" : 12345,
  "size" : 40,
  "shape": {
     "colour" : 'yellow',
     "dimension" : '2D'
  }
},
{
  "id" : 12346,
  "size" : 50,
  "shape": {
     "colour" : 'blue',
     "dimension" : '3D'
  }
}]

我需要它的样子:

[{
  "id" : 12345,
  "size" : 40,
  "shape__colour": 'yellow',
  "shape__dimension" : '2D;'
  }
},
{
  "id" : 12346,
  "size" : 50,
  "shape__colour": 'blue',
  "shape__dimension" : '3D'
  }
}]

我遇到的其他对象展平函数示例似乎生成了一个单级数组(完全删除了对象),而我需要保留单个对象,但它们内部的数据要处于一个级别。

任何帮助将不胜感激!

【问题讨论】:

  • SO 不是免费的代码编写服务。到目前为止,您尝试过什么?

标签: javascript


【解决方案1】:

另一个map函数:

const result = arr.map( 
  ({shape, ...rest}) => ({ shape__colour: shape.colour, shape__dimension: shape.dimension, ...rest })
);

或者如果形状具有动态属性:

const result = arr.map(
 ({shape, ...rest}) => Object.assign(rest, ...Object.keys(shape).map(key => {["shape__"+key] : shape[key]}))
);

【讨论】:

  • 这很棒,而且肯定让我更接近我需要的最终对象。原始数据集有大约 50 个其他“根”键,例如 id 和 size。有没有办法循环遍历这些并将它们添加到新对象而不明确列出它们?非常感谢您的帮助!
  • @techytruppers 请尝试我的答案;)它应该已经像这样工作了(这就是...rest 的全部意义所在)
  • 哦该死的..我认为那是“在此处添加其余部分”所以我将其删除(facepalm)。非常感谢!
【解决方案2】:

您可以使用map 返回具有扁平形状属性的新数组:

let result = arr.map(({id, size, shape}) => {
  return {
    id,
    size,
    shape_colour: shape.colour,
    shape_dimension: shape.dimension
  }
});

注意:您还可以在参数列表中解构形状对象:

let result = arr.map(({
  id,
  size,
  shape: { colour: shape_colour, dimension: shape_dimension }
}) => {
  return {
    id,
    size,
    shape_colour,
    shape_dimension,
  }
});

【讨论】:

  • 我更喜欢明确知道函数中的内容以及返回的内容。
  • 感谢您的宝贵时间!
猜你喜欢
  • 2016-06-20
  • 2016-12-26
  • 2018-02-24
  • 2015-05-23
  • 2020-12-22
  • 2016-06-27
  • 2023-01-11
  • 2020-06-23
  • 1970-01-01
相关资源
最近更新 更多