Сократить по одному массиву суммируя ломтики - PullRequest
2 голосов
/ 20 сентября 2019

У меня есть массив значений

let a = [1,2,3,4,5,6];

Я хочу суммировать конкретные срезы, например a.[0] + a.[1], давая новый массив:

[1 + 2, 3 + 4, 5 + 6]

Есть ли рекомендуемый способ сделать это с помощью метода less () или другого метода?Например, какой-нибудь параметр шага / диапазона?

Ответы [ 4 ]

1 голос
/ 20 сентября 2019

Потому что я хочу, чтобы @TJ Crowder был прав:)

const a = [1, 2, 3, 4, 5, 6];

// Loop over all values of the array
const res = a.reduce((tmp, x, xi) => {
  // Use Math.floor and xi (the index of the value we are treating)
  // to store the values on the returned array at the correct position
  tmp[Math.floor(xi / 2)] = (tmp[Math.floor(xi / 2)] || 0) + x;
  
  return tmp;
}, []);

console.log(res);

Также будет работать, если номер элемента не является парой

const a = [1, 2, 3, 4, 5];

const res = a.reduce((tmp, x, xi) => {
  tmp[Math.floor(xi / 2)] = (tmp[Math.floor(xi / 2)] || 0) + x;

  return tmp;
}, []);

console.log(res);

Альтернативное решение:

const a = [1, 2, 3, 4, 5, 6];

const res = [];

do {
  res.push(a.splice(0, 2).reduce((tmp, x) => tmp +x, 0));
} while (a.length);

console.log(res);
0 голосов
/ 21 сентября 2019

Простое и быстрое решение с [Array.prototype.reduce] может выглядеть так:

const array = [1,2,3,4,5,6];

const range = 2;

const result = array.reduce((all, item, i) => {

  const idx = Math.floor(i/range);
  if (!all[idx]) all[idx] = 0;
  all[idx] += item;

  return all;

},[]);


console.log(result);
0 голосов
/ 20 сентября 2019

Другой подход с Array#flatMap и с использованием только нечетных индексов для значения.

var array = [1, 2, 3, 4, 5, 6],
    result = array.flatMap((v, i, { [i + 1]: w = 0 }) => i % 2 ? [] : v + w);

console.log(result);
0 голосов
/ 20 сентября 2019

Вы можете сделать это с reduce, но это не подходящий инструмент для работы.Вот как отключить индекс и передать массив:

let array = [1,2,3,4,5,6];
let result = array.reduce((a, v, i) => {
    if (i % 2 == 1) {
        // It's an odd entry, so sum it with the
        // previous entry and push to the result array
        a.push(v + array[i - 1]);
    }
    return a;
}, []);
console.log(result);

Вы можете сжать это в краткую функцию стрелки, за счет ясности:

let array = [1,2,3,4,5,6];
let result = array.reduce((a, v, i) => ((i % 2 === 1 ? a.push(v + array[i - 1]) : 0), a), []);
console.log(result);

Возможно, более уместен простой цикл for, но:

let array = [1,2,3,4,5,6];
let result = [];
for (let n = 0; n < array.length; n += 2) {
    result.push(array[n] + array[n + 1]);
}
console.log(result);
...