#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);