hitakiri
@hitakiri

Как изменить одномерный массив на многомерный?

Есть массив:
arr : [
  [
    {name: A, age: 10},
    {name: B, age: 10},
    {name: A, age: 10},
    {name: B, age: 10},
  ],
  [
    {name: C, age: 10},
    {name: D, age: 10},
    {name: C, age: 10},
    {name: D, age: 10},
  ]
]


его необходимо преобразовать в
arr : [
  [
    [
       {name: A, age: 10},
       {name: A, age: 10},
     ],
     [
       {name: B, age: 10},
       {name: B, age: 10},
     ],
  ],
  [
    [
     {name: C, age: 10},
     {name: C, age: 10},
    ],
    [
     {name: D, age: 10},
     {name: D, age: 10},
    ]
  ]
]


Так же, есть массив
nameArr; [A, B, C, D]

Из того что наковырял:
let promArr= [[]];
      let resArr = [[]];
      for (let i = 0; i < arr.length i++) {
        for (let y = 0; y < nameArr.length; y++) {
          promArr[i][y] = arr[i].filter(item => item.name === nameArr[y]);
          resArr.push(promArr);
        }
      }
  • Вопрос задан
  • 119 просмотров
Решения вопроса 1
Seasle
@Seasle Куратор тега JavaScript
const array = [
  [
    { name: 'A', age: 10 },
    { name: 'B', age: 10 },
    { name: 'A', age: 10 },
    { name: 'B', age: 10 },
  ],
  [
    { name: 'C', age: 10 },
    { name: 'D', age: 10 },
    { name: 'C', age: 10 },
    { name: 'D', age: 10 },
  ],
];

const groupBy = (collection, extractKey) => {
  const cache = new Map();
  
  return collection.reduce((accumulator, entry) => {
    const key = extractKey(entry);
    if (!cache.has(key)) {
      const group = [];

      cache.set(key, group);
      accumulator.push(group);
    }
    cache.get(key).push(entry);

    return accumulator;
  }, []);
};

const newArray = array.map(entry => groupBy(entry, item => item.name));

console.log(newArray);
/*
[
  [
    [ { name: 'A', age: 10 }, { name: 'A', age: 10 } ],
    [ { name: 'B', age: 10 }, { name: 'B', age: 10 } ]
  ],
  [
    [ { name: 'C', age: 10 }, { name: 'C', age: 10 } ],
    [ { name: 'D', age: 10 }, { name: 'D', age: 10 } ]
  ]
]
*/

Также провел тесты, нашел самый шустрый вариант.
const groupBy = (collection, extractKey) => {
  const cache = new Map();
  
  for (const entry of collection) {
    const key = extractKey(entry);
    if (!cache.has(key)) {
      cache.set(key, []);
    }
    cache.get(key).push(entry);
  }
  
  return [...cache.values()];
};
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
summer Ярославль
от 100 000 до 140 000 ₽
КРАФТТЕК Санкт-Петербург
от 60 000 до 80 000 ₽
19 апр. 2024, в 11:14
65000 руб./за проект
19 апр. 2024, в 11:08
5000 руб./за проект
19 апр. 2024, в 10:59
150000 руб./за проект