@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
        }
      }
    }
  })
}
  • Вопрос задан
  • 124 просмотра
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
const uniqueWithSum = arr =>
  arr.reduce((acc, n) => {
    const keys = n.slice(0, -1);
    const item = acc.find(m => m.length === n.length && keys.every((k, i) => k === m[i]));
    (item ?? (acc[acc.length] = [ ...keys, 0 ]))[keys.length] += n[keys.length];
    return acc;
  }, []);

или

const uniqueWithSum = (function(arr) {
  const indexTree = new Map;
  return arr.reduce((acc, [...keys]) => {
    const val = keys.pop();
    const indexes = keys.reduce((p, c) => p.set(c, p.get(c) ?? new Map).get(c), indexTree);
    const index = indexes.set(this, indexes.get(this) ?? ~-acc.push([ ...keys, 0 ])).get(this);
    acc[index][keys.length] += val;
    return acc;
  }, []);
}).bind(Symbol());

или

const uniqueWithSum = arr =>
  [...arr.reduce((acc, n) => {
    const end = n.length - 1;
    const key = n.reduce((p, c, i) => i === end ? p : p.set(c, p.get(c) ?? new Map).get(c), acc[0]);
    acc[1].set(key, acc[1].get(key) ?? n.map((m, i) => i !== end && m)).get(key)[end] += n[end];
    return acc;
  }, [ new Map, new Map ])[1].values()];
Ответ написан
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]);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
21 нояб. 2024, в 19:31
500 руб./за проект
21 нояб. 2024, в 19:28
200000 руб./за проект