@Oleg_F

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

Добрый день.
У меня задача, просуммировать массивы внутри массива. Просуммировать нужно последний элемент вложенного массива, если предыдущие элементы массива между собой равны.
Пробовал, код ниже, но не получается. Подскажите по возможности, как можно сделать.
На входе массив:
let arrStart = [
    ['Первое значение', 'Второе значение', 'Третье значение', 1],
    ['Первое значение', 'Второе значение', 'Четвертое значение значение', 1],
    ['Первое значение', 'Второе значение', 'Третье значение', 1],
    ['Первое значение', 'Пятое значение значение', 'Третье значение', 1],
    ['Первое значение', 'Второе значение', 'Третье значение', 1],
    ['Первое значение', 'Пятое значение значение', 'Третье значение', 1],
    ['Первое значение', 'Третье значение', 'Второе значение',  1]
  ]


Должно получиться:
arrFinish = [
  ['Первое значение', 'Второе значение', 'Третье значение', 3],
  ['Первое значение', 'Второе значение', 'Четвертое значение значение', 1],
  ['Первое значение', 'Пятое значение значение', 'Третье значение', 2],
['Первое значение', 'Третье значение', 'Второе значение',  1]
]


Пробовал по разному, один из последних вариантов -
function test() {
  let arrStart = [
    ['Первое значение', 'Второе значение', 'Третье значение', 1],
    ['Первое значение', 'Второе значение', 'Четвертое значение значение', 1],
    ['Первое значение', 'Второе значение', 'Третье значение', 1],
    ['Первое значение', 'Пятое значение значение', 'Третье значение', 1],
    ['Первое значение', 'Второе значение', 'Третье значение', 1],
    ['Первое значение', 'Пятое значение значение', 'Третье значение', 1],
    ['Первое значение', 'Третье значение', 'Второе значение',  1]
  ]

  let arrFinish = []
  arrStart.forEach(function (el, index) {
    if (index == 0) {
      arrFinish.push(el)
    }
    else {

      for (let i = 0; i < arrFinish.length; i++) {
        let elA = arrFinish[i]
        if (elA[0] == el[0] && elA[1] == el[1] && elA[2] == el[2]) {
          elA[3] = elA[3] + el[3]
          break
        }
        else {
          arrFinish.push(el)
          break
        }
      }
    }
  })
}
  • Вопрос задан
  • 95 просмотров
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
const groupedArr = arr.reduce((acc, n) => {
  const keys = n.slice(0, -1);
  let group = acc.find(m => m.length === n.length && keys.every((k, i) => k === m[i]));
  if (!group) {
    acc.push(group = [ ...keys, 0 ]);
  }
  group[keys.length] += n[keys.length];
  return acc;
}, []);

или

const groupedArr = arr.reduce((acc, n) => {
  const keys = n.slice(0, -1);
  const groups = keys.reduce((groups, k) => groups.set(k, groups.get(k) ?? new Map).get(k), acc[1]);
  let group = groups.get(acc[2]);
  if (!group) {
    acc[0].push(group = [ ...keys, 0 ]);
    groups.set(acc[2], group);
  }
  group[keys.length] += n[keys.length];
  return acc;
}, [ [], new Map, Symbol() ])[0];
Ответ написан
ProgrammerForever
@ProgrammerForever
Учитель, автоэлектрик, программист, музыкант
let data = arrStart.map(x=>({key: JSON.stringify(x.slice(0,x.length-1)), n:x.at(-1)}));
let out = {};
data.forEach(x=>{
	if(out[x.key]){
		out[x.key]+=x.n;
	}else{
		out[x.key]=x.n;
	};
});
let arrFinish = Object.entries(out).map(([key, n])=>[...JSON.parse(key), n]);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы