Создание массива из каждого ключа в массиве объектов

У меня есть массив, который выглядит примерно так: массив объектов намного больше, и каждый объект имеет больше свойств, хотя это структура.

  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, чтобы заставить это работать.

Спасибо.

Ваша функция map пытается деструктурировать key из объектов в arr, но такого свойства нет. Также Object.entries(arr) кажется необычным; вы можете перебирать массив более простыми способами.

Dave Newton 06.05.2022 20:34

Согласно вашему комментарию к ответу: если вы на самом деле не знать, что такое ключи (что является важной информацией), я бы выбрал другой подход: объект с ключами в объектах массива с массивом их извлеченных значений . Это также позволяет выполнять одну итерацию массива вместо одной для каждого свойства, которое вы хотите извлечь.

Dave Newton 06.05.2022 20:39
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
27
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать 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(), зная имена.

Eric.18 06.05.2022 20:36

@Spectirc, принято. Большое спасибо. Ты гений. Шутки в сторону.

Eric.18 06.05.2022 20:44

Другие вопросы по теме