У меня есть массив, который выглядит примерно так: массив объектов намного больше, и каждый объект имеет больше свойств, хотя это структура.
let arr = [
{ id: 1, name: "tony", hatColor: "blue" },
{ id: 2, name: "larry", hatColor: "red" },
{ id: 3, name: "stuart", hatColor: "green" },
];
Я хочу создать массив для каждого ключа в этом массиве, поэтому у меня есть массив со всеми идентификаторами, массив со всеми именами и один со всеми цветами шляпы.
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.info(result);
}
}
Это возвращает массив неопределенных. Я надеюсь, что есть способ сделать это, я не хочу писать много жестко закодированных операторов 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.info(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.info(result)
Но что, если я не знаю ключей или значений? просто это массив объектов с ключами и значениями? Это сработает, но тогда мне придется написать примерно 100 groupPropValues(), зная имена.
@Spectirc, принято. Большое спасибо. Ты гений. Шутки в сторону.
Ваша функция
map
пытается деструктурироватьkey
из объектов вarr
, но такого свойства нет. ТакжеObject.entries(arr)
кажется необычным; вы можете перебирать массив более простыми способами.