从对象数组中的每个键创建一个数组

Creating an array from each key in an array of objects

我有一个类似于此的数组:对象数组更大,每个对象都有更多属性,不过这就是结构。

  let arr = [
    { id: 1, name: "tony", hatColor: "blue" },
    { id: 2, name: "larry", hatColor: "red" },
    { id: 3, name: "stuart", hatColor: "green" },
  ];

我想为这个数组中的每个键创建一个数组,所以我有一个包含所有 ID 的数组、一个包含所有名称的数组和一个包含所有 hatColors 的数组。

idArr = [1, 2, 3];
nameArr = [tony, larry, stuart];
hatColorArr = [blue, red, green];

我不知道从另一个脚本返回的对象数组到底是什么样子。

我试过的是:

  for (var [key, value] of Object.entries(arr)) {
    for (var [key, value] of Object.entries(value)) {
      var result = arr.map(({ key }) => key);
      console.log(result);
    }
  }

这个returns一个未定义的数组。我希望有办法做到这一点,我不想写很多硬编码的 if push 语句来让它工作。

谢谢。

您可以使用 Array.map 为数组中的每个项目提取 属性 值。

let arr=[{id:1,name:"tony",hatColor:"blue"},{id:2,name:"larry",hatColor:"red"},{id:3,name:"stuart",hatColor:"green"}];

function groupPropValues(objs, prop){
    return objs.map(e => e[prop])
}

idArr = groupPropValues(arr, 'id');
nameArr = groupPropValues(arr, 'name');
hatColorArr = groupPropValues(arr, 'hatColor');
console.log(idArr, nameArr, hatColorArr)

如果要自动生成数组,可以通过获取数组中每个对象的属性,然后获取值并将它们存储在对象中来实现。

let arr=[{id:1,name:"tony",hatColor:"blue"},{id:2,name:"larry",hatColor:"red"},{id:3,name:"stuart",hatColor:"green"}];

function groupPropValues(objs, prop) {
  return objs.map(e => e[prop])
}

const props = [...new Set(arr.reduce((a,b) => (a.push(Object.keys(b)), a), []).flat())]

const result = props.reduce((a,b) => (a[b] = groupPropValues(arr, b), a), {})

console.log(result)