扁平化Java对象数组的快速方法

时间:2019-03-24 13:44:18

标签: javascript

我有一个生成的对象数组,如下所示:

[ 
  {obj1: {
    key: 'value'
  }},
  {obj2: {
    key: 'value2'
  }},
  {obj3: {
    key: 'value3'
  }}
]

我想用以下输出展平数组:

[ 
  {
    key: 'value'
  },
  {
    key: 'value2'
  },
  {
    key: 'value3'
  }
]

我正在使用for循环来执行此操作,该循环可以工作,但是数组的大小会很大,想知道是否有更有效的方法可以做到这一点?

for (var key in array) {
  let obj = array[key];
  for (var key in obj) { 
    newArray.push(obj[key]);
  }
}

output: 
newArray: [
  {
    key: 'value'
  },
  {
    key: 'value2'
  },
  {
    key: 'value3'
  }
]

我正在寻找最简单的方法,ES6或Lodash也欢迎提供解决方案。

已更新以反映正确的数组格式。

2 个答案:

答案 0 :(得分:2)

您可以简单地使用reduceObject.values

let arr = [{obj1: {key: `value`}},{obj2: {key: `value2`
}},{obj3: {key: `value3`}}]

let op = arr.reduce((op,e)=> op.concat(Object.values(e)),[])

console.log(op)

关心速度时,可以使用简单的for循环。

let arr = [{obj1: {key: `value`}},{obj2: {key: `value2`
    }},{obj3: {key: `value3`}}]

let op = []

for(let i=0; i<arr.length; i++){
  let values = Object.values(arr[i])
  op = op.concat(values)
}

console.log(op)

答案 1 :(得分:1)

您可以使用Array.mapObject.values

映射将数组中的每个元素“映射”到新数组。

它接受数组的每个元素,并对其执行操作。
此操作的结果成为新Array中的相应元素。
这个新的数组就是返回的。

要将对象转换为数组:您可以使用Object.valuesObject.keysObject.entries
Object.values取消引用对象中的每个键,并将其转换为保存该键值的数组元素。

const arr = [ 
  {obj1: {key: 'value'}},
  {obj2: {key: 'value2'}},
  {obj3: {key: 'value3'}}
];

let newArr = arr.map(obj => (
  {key: Object.values(obj)[0].key}
));

console.log(newArr);  

要返回对象,必须将其包装在括号中。

在第一次迭代中,obj == { obj1: { key: 'value' }},即输入数组arr中的第一个元素。

然后

Object.values(obj) == [{key: 'value'}]

因此,我们需要获取索引0处的元素以将对象从数组{key: 'value'}中拉出。

或者,如果您知道可以依赖数组中元素的命名结构(外部对象的键),则可以 执行此操作,这样可能更容易推理: >

const arr = [ 
  {obj1: {key: 'value'}},
  {obj2: {key: 'value2'}},
  {obj3: {key: 'value3'}}
];

let newArr2 = arr.map( (obj, i) => (
  { key: obj['obj'+(i+1)].key }
));

console.log(newArr2);  

注意:您需要将i+1括在括号中,以强制添加优先于JS自动类型转换和字符串连接。否则,您将获得obj1, obj2, obj3作为对象键,而不是obj01, obj11, obj21