Как создавать массивы из свойства объекта в другом массиве

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

Например, у меня есть такой объект:

function Object1(property1, property2, property3){
this.property1 = property1;
this.property2 = property2;
this.property3 = property3;
}

Затем у меня есть массив с несколькими из этих объектов, однако некоторые из них имеют одинаковое значение для property1, например:

const obj1 = new Object1(id_1, some_value_1, some_value_2);
const obj2 = new Object1(id_2, some_value_2, some_value_2);
const obj3 = new Object1(id_1, some_value_3, some_value_3);
const obj4 = new Object1(id_2, some_value_4, some_value_4);

var objectArray = [obj1, obj2, obj3, obj4];

Теперь, учитывая этот массив, я хочу создать новые массивы на основе Object1.property1, чтобы получить следующие массивы:

array1 = [obj1, obj3];
array2 = [obj2, obj4];

Без сомнения, это не такая уж сложная задача, но я не могу думать об этом. Спасибо за вклад.

Есть два предостережения: я не всегда буду знать, насколько велик objectArray, и я не буду знать, сколько объектов в этом массиве совместно используют свойство, что означает необходимость x количества новых массивов.

Что вы имеете в виду под «создавать новые массивы на основе Object1.property1» ??

Rahul Desai 02.05.2018 00:39

А как создаются новые массивы? Какие критерии?

muecas 02.05.2018 00:40
Поведение ключевого слова "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) для оценки ваших знаний,...
2
2
2 306
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Вы можете использовать reduce для группировки объектов по определенному свойству:

function Object1(property1, property2, property3) {
  this.property1 = property1;
  this.property2 = property2;
  this.property3 = property3;
}

const obj1 = new Object1('id_1', 'some_value_1', 'some_value_2');
const obj2 = new Object1('id_2', 'some_value_2', 'some_value_2');
const obj3 = new Object1('id_1', 'some_value_3', 'some_value_3');
const obj4 = new Object1('id_2', 'some_value_4', 'some_value_4');

const objectArray = [obj1, obj2, obj3, obj4];

const outputObj = objectArray.reduce((accum, obj) => {
  const id = obj.property1;
  if (!accum[id]) accum[id] = [];
  accum[id].push(obj);
  return accum;
}, []);

const [array1, array2] = Object.values(outputObj);
console.info(array1);
console.info(array2);

Вы также должны позаботиться о том, чтобы не смешивать const и var - если вы собираетесь использовать ES6, всегда используйте const (и редко используйте let, когда требуется переназначение).

Предложение сохранить если-условие: accum[id] = [...(accum[obj] || []), obj]

Kristianmitk 02.05.2018 00:48

Вызов .reduce определенно направил меня на правильный путь, я думаю, спасибо.

SQLiteNoob 02.05.2018 01:08

вы можете использовать .filter() для выбора объектов в массиве на основе значения свойства:

function Object1(property1, property2, property3) {
  this.property1 = property1;
  this.property2 = property2;
  this.property3 = property3;
}

const obj1 = new Object1(1, 'a', 'A');
const obj2 = new Object1(2, 'b', 'B');
const obj3 = new Object1(1, 'c', 'C');
const obj4 = new Object1(2, 'd', 'D');

const objectArray = [obj1, obj2, obj3, obj4];

const array1 = objectArray.filter(e => e.property1 == 1)
const array2 = objectArray.filter(e => e.property1 == 2)

console.info(array1)
console.info(array2)

Для простоты я создам массив и объекты встроенными.

Это будет сделано за два прохода. Сначала сгруппируйте prop2 и prop3 по prop1. Затем отфильтруйте уникальные элементы для каждой группы.

var things = [
  {prop1: 1, prop2: 'a', prop3: 'b'},
  {prop1: 2, prop2: 'b', prop3: 'b'},
  {prop1: 1, prop2: 'c', prop3: 'c'},
  {prop1: 2, prop2: 'd', prop3: 'd'}
];

var grouped = things.reduce(function (groups, thing) {
  groups[thing.prop1] = groups[thing.prop1] || [];
  groups[thing.prop1].push(thing.prop2);
  groups[thing.prop1].push(thing.prop3);
  return groups;
}, {});

/*
We are now grouped by prop1.
{
1: ["a", "b", "c", "c"],
2: ["b", "b", "d", "d"]
}
*/

var groupedAndUniq = Object.keys(grouped).reduce(function (groups, key) {
  groups[key] = [...new Set(grouped[key])];
  return groups;
}, {});

console.info(groupedAndUniq);

/*
We are now grouped and unique.
{
1: ["a", "b", "c"],
2: ["b", "d"]
}
*/

Спасибо за совет. Я не хочу отделять свойства от объектов, мне нужны объекты в такт.

SQLiteNoob 02.05.2018 01:01

Вызов .reduce определенно направил меня на правильный путь, я думаю, спасибо.

SQLiteNoob 02.05.2018 01:08

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