Как сложить два массива в массиве объектов

324
13 сентября 2017, 15:00

Есть массив в котором находятся объекты с массивом данных.

Нужно получить сумму всех элементов массива объектов и добавить каждую сумму в объект, затем нужно получить сумму двух объектов и так же добавить в объект.

Так же нужно сложить элементы из массива первого объекта с элементами из массива второго эл и добавить в массив с суммой каждого свойства т.е объект а) [1,2,3] и объект б) [4,5,6] сложить их и получить на выходе [ 5,7,9]

Смог получить сумму двух элементов массива но вариант оказался весьма деревянным, т.к привязан к свойству первого объекта

function chartSumm(arr) { 
  let obj, 
    firstArr = [], 
    lastArr = [], 
    sumArray = [] 
 
  arr.forEach(function(item, index) { 
    for (let el in item.data) { 
      if (item.label === 'Эккономия на аннуляции') { 
        firstArr = item.data; 
      } else { 
        lastArr = item.data 
      } 
    } 
  }); 
  let firstObjSum = firstArr.reduce(function(prev, curr, index) { 
    return prev + curr 
  }); 
  let twoObjSum = lastArr.reduce(function(prev, curr, index) { 
    return prev + curr 
  }); 
 
  obj = { 
    'Цена у стойки': firstObjSum, 
    'Аннуляция без штрафа': twoObjSum, 
    'Общая экономия': firstObjSum + twoObjSum 
  }; 
  console.log(obj) 
} 
 
chartSumm([{ 
    label: 'Эккономия на аннуляции', 
    backgroundColor: '#ef9d4d', 
    data: [1000, 400, 1500, 1500, 3000, 4000] 
  }, 
  { 
    label: 'Экономия на цене у стойки', 
    backgroundColor: '#476e8f', 
    data: [1170, 460, 2000, 2500, 2700, 4000] 
  }, 
])

Answer 1

Так как лейблы разные, то их в любом случае придется прописывать. Чтобы сделать функцию более универсальной ( и не для только лишь 2 обхектов) можно вынести лейбл результата в объект. Я так же вынес лейбл Общая Экономия отдельно из функцию, но можно задавать его и внутри.

function chartSumm(arr, sumLabel, elementSumLabel) { 
  var result = {}; 
  result[sumLabel] = 0; 
  result[elementSumLabel] = [0, 0, 0, 0, 0, 0] 
 
  arr.forEach(function(item, index) { 
    result[item.resultLabel] = 0; 
     
    for (var i = 0; i < item.data.length; i++) { 
      result[elementSumLabel][i] += item.data[i]; 
      result[item.resultLabel] += item.data[i] 
    } 
     
    result[sumLabel] += result[item.resultLabel]; 
  }); 
     
  return result; 
} 
 
var info = chartSumm([{ 
    label: 'Эккономия на аннуляции', 
    resultLabel: 'Цена у стойки', 
    backgroundColor: '#ef9d4d', 
    data: [1000, 400, 1500, 1500, 3000, 4000] 
  }, 
  { 
    label: 'Экономия на цене у стойки', 
    resultLabel: 'Аннуляция без штрафа', 
    backgroundColor: '#476e8f', 
    data: [1170, 460, 2000, 2500, 2700, 4000] 
  }, 
], 'Общая экономия', 'Сумма элементов'); 
 
console.log(info);

READ ALSO
Как можно получить имя?

Как можно получить имя?

Если передам объект то в table будет имя barrel, но если пишу просто Barrel получаю в name function, как получить имя, так же как из объекта

258
Поиск данные на странице

Поиск данные на странице

Нужно сделать поиск на странице, на подобии как сделано в хроме Ctrl + G

243
Как переходить на модальное окно закрыв родителя и вернуться обратно?

Как переходить на модальное окно закрыв родителя и вернуться обратно?

Нужно открыть модальное окно чтобы получить значение, знаю какНо нужно чтобы потом вернулось(после нажатия кнопки) то же родительское окно!

276