Создать двойной массив из равных элементов - PullRequest
0 голосов
/ 19 декабря 2018

Я новичок в Javascript.Я хочу создать 2D-массив из равных элементов (элементы являются объектами).Например,

oldArray = [a,b,c,d,e,f]  (a=b=f, d=e)

Допустим, объект a равен объекту b и объекту f.Тогда объект d равен объекту e.Таким образом, новый массив должен быть

newArray = [[a,b,f],[c],[d,e]]

. Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Вы можете попробовать следующее:

  • Создать массив temp, содержащий объекты со свойствами
    • obj - ссылка на объект
    • index - индекс объектав полученном массиве
  • Выполните итерацию по oldArray и для каждого объекта в нем проверьте, существует ли он в массиве temp.
    • Если он не существует, добавьте запись для него в массиве temp, а также добавьте его в массив результатов.
    • В противном случае обновите существующий вложенный массив в массиве результатов.

let a = {x:1}, c = {y:2}, d = {z:3};
let b = a, f = a, e = d;
let oldArray = [a,b,c,d,e,f];
let result = [];
let temp = [];
oldArray.forEach(c => {
  let item = temp.find(o => o.obj === c);
  if(item) result[item.index].push(c);
  else {
    temp.push({obj:c,index:result.length});
    result.push([c]);
  }
});
console.log(result);
0 голосов
/ 19 декабря 2018

Создайте функцию groupBy, используя Array.reduce().Функция groupBy принимает предикат, поэтому вы можете определить свойство / значение группировки.Результатом группировки является объект, в котором каждое свойство представляет собой группу элементов (массив).Используйте Object.values() для извлечения в массив массивов.

const groupBy = (predicate, arr) =>
  arr.reduce((r, o) => ({
    ...r,
    [predicate(o)]: [...r[predicate(o)] || [], o]
  }), {});
  
const data = [{ id: 'a', val: 1 }, { id: 'b', val: 1 }, { id: 'c', val: 2 }, { id: 'd', val: 3 }, { id: 'e', val: 3 }, { id: 'f', val: 1 }];

const result = Object.values(groupBy(({ val}) => val, data));

console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...