Javascript: лучший способ разбить массив, если сумма удовлетворяет условию при циклическом прохождении по массиву

#javascript #arrays

#javascript #массивы

Вопрос:

У меня есть этот массив

 [ 1, -1, -1, -1, 1, -1, 1, 1 ]
  

Я пытаюсь найти наилучший способ получить то, что мне нужно сделать. Я пытаюсь выяснить, нужно ли мне использовать метод reduce, цикл do..while или что-то еще.

Во-первых, мне нужно выполнить цикл по массиву. Во-вторых, мне нужно суммировать, когда я перебираю массив. Если сумма 0 равна, то вставьте элементы, которые суммируются 0 , в новый массив.

Например, если первые два элемента в массиве [1, -1] суммируются 0 , затем нажмите [1, -1] в новый массив, чтобы получить этот результат:

 [[1, -1], [-1, -1, 1, -1, 1, 1]]
  

Поэтому я подумал, что, возможно, этот reduce метод является лучшим кандидатом для этой работы. Вот моя попытка:

 let hikeArr = [ 1, -1, -1, -1, 1, -1, 1, 1 ];

let newArr = hikeArr.reduce((a, b) => {
        let sum = a   b;
        if( sum == 0) {
            a.push(b)
        }
        return a;
    }, []);
    console.log("newArr", newArr);
  

Есть предложения?

Комментарии:

1. как насчет остатка, если сумма, равная нулю, недоступна?

Ответ №1:

Я не думаю reduce , что это сработает слишком хорошо, поскольку вам нужно отслеживать 3 отдельные вещи: текущую сумму, объединенный массив и выполняемый массив. (Даже если бы нужно было отслеживать только один объект, это тоже было бы неуместно, IMO) Вместо этого используйте внешние переменные и for цикл:

 let hikeArr = [ 1, -1, -1, -1, 1, -1, 1, 1 ];

const output = [];
let sum = 0;
let subarr = [];
for (const num of hikeArr) {
  sum  = num;
  subarr.push(num);
  if (sum === 0) {
    output.push(subarr);
    subarr = [];
  }
}
console.log(output);  

Комментарии:

1. Это лучшее решение, ИМХО. Используются другие ответы reduce , но это кажется довольно «принудительным». Я думаю, что простое for утверждение — самый чистый и простой способ.

Ответ №2:

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

 let array = [1, -1, -1, -1, 1, -1, 1, 1],
    result = array.reduce(((temp, sum) => (r, v) => {
        temp.push(v);
        sum  = v;
        if (!sum) {
            r.push(temp);
            temp = [];
        }
        return r;
    })([], 0), []);

console.log(result);  

Комментарии:

1. является ли это уменьшением в уменьшении? ((temp, sum) => (r, v) =>

2. это замыкание / IIFE в сокращении.

Ответ №3:

Это можно просто сделать с помощью Array.reduce .

При Array.reduce обратном вызове для ввода current value вы можете ввести это значение subArr и вычислить сумму.

И как только sum достигнет 0 , нажмите subArr to main result и отформатируйте их до начального значения.

 let hikeArr = [ 1, -1, -1, -1, 1, -1, 1, 1 ];


let subArr = [];
let sum = 0;
const result = hikeArr.reduce((acc, cur) => {
  subArr.push(cur);
  sum  = cur;
  if (sum === 0) {
    acc.push(subArr);
    subArr = [];
    sum = 0;
  }
  return acc;
}, []);
console.log(result);