Последовательное добавление вложенных массивов в JavaScript

Я пытаюсь добавить 4 вложенных массива с 9 числовыми значениями вместе в javascript и имею проблемы. В настоящее время они хранятся как: x = [[Array1(9)], [Array2(9)], [Array3(9)], [Array4(9)]]

Я хотел бы «сжать» их вместе и добавить в процессе, добавив Array1[0] с Array2-4[0] ко всем девяти значениям. Таким образом, каждый из четырех массивов суммирует свои совпадающие идентификаторы. Массивы выглядят так:

[1, 2, 4, 3.6, 1.05, 4.65, 1.95, 0.5, 2.5]

[0.432, 0.602, 1.29, 1.146, 0.558, 1.43, 0.686, 0.178, 1.024]

перевод на:

[1.432, 2.602, и т.д...]

Кажется, я не могу получить функцию x.map(), чтобы собрать их вместе так, как я хочу. Любая помощь будет оценена по достоинству.

Спасибо,


person Phil S    schedule 28.03.2020    source источник
comment
если вы нашли какой-либо ответ, отметьте его как правильный, чтобы пользователи с похожей проблемой знали ответ   -  person M A Salman    schedule 30.03.2020


Ответы (2)


Вы можете перемещаться по внешнему массиву с помощью Array.prototype.reduce() и перебирать вложенные массивы один за другим с помощью Array.prototype.forEach() добавление элементов вложенного массива к соответствующему элементу результирующего массива:

const src = [[1, 2, 4, 3.6, 1.05, 4.65, 1.95, 0.5, 2.5], [0.432, 0.602, 1.29, 1.146, 0.558, 1.43, 0.686, 0.178, 1.024]]
      
      result = src.reduce((r,a) => (a.forEach((n,j) => r[j] = (r[j]||0)+n), r),[])
      
console.log(result)
.as-console-wrapper{min-height:100%;}

person Yevgen Gorbunkov    schedule 28.03.2020

Используйте первый массив для отображения, добавьте к каждому значению соответствующие значения из других 3 массивов. Вы можете создать для него функцию для массивов произвольной длины (см. sumArrays во фрагменте)

const arrays = getData();
let sums = arrays[0].map( (v, i) => v + arrays[1][i] + arrays[2][i] + arrays[3][i] );
let sums2 = sumArrays(arrays);

console.log(sums);
console.log(sums2);

function sumArrays(arrays) {
 const checkLengthEquality = () => {
  let cando = arrays.map(v => v.length);
  return Math.max.apply(null, cando) === Math.min.apply(null, cando);
 };

 if (!checkLengthEquality()) {
  throw Error("Arrays not of equal length");
 }
 
 const sum = (v, i) => {
  let len = arrays.length;
  while(len-- > 1) {
    v += arrays[len][i];
  }
  return v;
 };
 
 return arrays[0].map( (v, i) => sum(v, i) );
}

function getData() {
  return [
    [1, 2, 4, 3.6, 1.05, 4.65, 1.95, 0.5, 2.5], 
    [0.432, 0.602, 1.29, 1.146, 0.558, 1.43, 0.686, 0.178, 1.024],
    [3.1, 2, 4.3, 3.8, 1.5, 6.5, 95, 1.5, 2.5],
    [12, 1, 1.3, 8, 5.3, 6.2, 5, 1, 2.3]
  ];
}
.as-console-wrapper { top: 0; max-height: 100% !important; }

person KooiInc    schedule 28.03.2020
comment
что, если есть много внутренних массивов, вы не можете писать массивы [1] [i], массивы [2] [i], массивы [3] [i].......... так далее ... там внутри карты должен быть внутренний цикл для повторения массивов. длина раз ... мысли? - person M A Salman; 29.03.2020