@leyarthemes

Как сгруппировать элементы вложенных массивов?

Есть массив: var ind = ["Яблоко", "Груша", "Банан"];.

И ещё массив:

var arr = [
  ["Яблоко", "Банан", "Груша", "Груша", "Яблоко", "Яблоко", "Банан"],
  [11, 12, 34, 54, 76, 23, 232],
  [33, 54, 22, 11, 23, 21, 33]
];

Надо объединить все значения подмассивов в порядке, как они идут в массиве ind, чтобы получилось так:

var arr = [
  ["Яблоко", "Груша", "Банан"],
  [[11, 76, 23], [34, 54], [12, 232]],
  [[33, 23, 21], [22, 11], [54, 33]]
];
  • Вопрос задан
  • 217 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
const result = ind.reduce((acc, col) => {
  arr.forEach((n, i) => {
    acc[i].push(i ? n.filter((m, j) => arr[0][j] === col) : col);
  });
  
  return acc;
}, arr.map(() => []));

или

const indObj = Object.fromEntries(ind.map((n, i) => [ n, i ]));
const result = arr.reduce((acc, n, i) => (
  i && n.forEach((m, j) => acc[i][indObj[arr[0][j]]].push(m)),
  acc
), arr.map((_, i) => ind.map(n => i ? [] : n)));
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
anatoly_kulikov
@anatoly_kulikov
Помог ответ? Отметь решением!
Логику примерно такую вижу - функция принимает массив arr, первый элемент массива оставляет (временно записывает в другую переменную), а со следующими группами начинается сбор в подмассивы циклами for.
Их работу нужно настроить за счёт переменных-счетчиков, в зависимости от значения которых массивы по разному собираются.

В конце новый массив вставлятся в изначальный. В кратцк так.
Ответ написан
Комментировать
Не совсем понятна логика преобразования числовых массивов. Если со строками понятно, то с числами по условию какой-то чёрный ящик получается.

const source = ['Яблоко', 'Банан', 'Груша', 'Груша', 'Яблоко', 'Яблоко', 'Банан'];

const mix_source = [
  ['Яблоко', 'Банан', 'Груша', 'Груша', 'Яблоко', 'Яблоко', 'Банан'],
  [33, 22, 3331, 234, 3234],
];

// Функция для обработки строковых массивов
const clearStringArray = (arr) => {
	const clear_arr = [];

	arr.forEach((arr_item) => {
		if(clear_arr.indexOf(arr_item) === -1) {
	  	clear_arr.push(arr_item);
	  }
	});
  
  return clear_arr;
}

// Функция для обработки числовых массивов
const clearNumberArray = (arr) => {
  // ...
  return arr;
}

// Функция для обработки сложного массива
const clearMixArray = (arr) => {
	return mix_source.map((mix_item) => {
    const is_array = Array.isArray(mix_item);
    const array_have_first_element = typeof mix_item[0] !== undefined;
    const first_element_type = typeof mix_item[0];

    if (is_array && array_have_first_element) {
      switch(first_element_type) {
        case "string": return clearStringArray(mix_item);
        case "number": return clearNumberArray(mix_item);
      }
    }
  });
}

// Пример обработки строкового массива
console.log(clearStringArray(source));
//(3) ["Яблоко", "Банан", "Груша"]

console.log(clearMixArray(mix_source));
/*
	0: (3) ["Яблоко", "Банан", "Груша"]
	1: (5) [33, 22, 3331, 234, 3234]
	length: 2
*/
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
30 апр. 2024, в 23:39
3000 руб./за проект
30 апр. 2024, в 23:32
1500 руб./за проект
30 апр. 2024, в 22:44
500 руб./в час