Вычислить значение в массиве при определенных условиях - PullRequest
1 голос
/ 14 июля 2020

У меня есть массив, как показано ниже:

const array = [1, 3, 5, 7, 9, 11, 8, 10, 13, 15];

Я хочу суммировать значения меньше 10 в массиве, чтобы суммировать и получить больше 10, как показано ниже:

const newArray = [16, 20, 18, 13, 15]; // 16 at index 0 is from (1+3+5+7), 20 at index 1 is from (9+11), 18 at index 2 is from (8+10)

Это это то, что я пытался, и я застрял здесь:

const minTen = array.reduce((accumulator, currentValue) => {
    
    if (currentValue < 10) {

        // 1. Sum value in array to become >= 10
        const accumValue = currentValue += // help here please or any othr alternative

        // 2. Push new value to the array
        accumulator.push(accumValue);
    }
    return accumulator;
}, []);

console.log(minTen); // [16, 20, 18, 13, 15]

Ответы [ 7 ]

2 голосов
/ 14 июля 2020

Шаги:

  1. Итерировать по заданному массиву и дать ему условие - если число меньше 10, просуммируйте его, иначе превратите sh в массив результатов.
  2. Вставьте окончательную сумму на первое место массива результатов.
  3. Готово

const array = [1, 3, 5, 7, 9, 11, 13, 15]

let sum = 0, resultArr = []
array.forEach(i => i<10 ? sum += i : resultArr.push(i))
resultArr = [sum, ...resultArr]
console.log(resultArr)
1 голос
/ 14 июля 2020

Просто проверьте последнее значение набора результатов.

const
    array = [1, 3, 5, 7, 9, 11, 8, 10, 13, 15],
    minTen = array.reduce((accu, value) => {
        if (accu[accu.length - 1] < 10) accu[accu.length - 1] += value;
        else accu.push(value);
        return accu;
    }, []);

console.log(minTen); // [25, 11, 18, 13, 15]
0 голосов
/ 14 июля 2020

Поэкспериментировав некоторое время, я обнаружил, что этот код, который в основном использует необработанные операции, а не библиотечные функции, суммирует числа в исходном массиве, чтобы сформировать значения, превышающие 10, и прекращает суммирование, как только сумма равна 11 или выше:

const array = [1, 3, 5, 7, 9, 11, 8, 10, 13, 15];
 let sum = 0;
 let arrayLength = array.length;
for(var i = 0; i < arrayLength; i++) {
    if (array[i] <= 10) {
        sum += array[i];
        let n = i+1;
        if (n < arrayLength) {
            do {
                sum += array[n];
                n++;
            }
            // keep adding numbers from the array until a sum of 11 or greater
        while((n) < arrayLength && array[n] <= 10 && sum < 11);
        }
        // replace the numbers in the array that were summed together
        // with the sum of those numbers.
        array.splice(i, n - i, sum);
        sum = 0; // reset for next iteration
    }
    // the for loop advances to the next position in the array automatically
}

console.log(array); // outputs [16, 20, 18, 13, 15]
0 голосов
/ 14 июля 2020

Я не рекомендую выполнять две разные операции, фильтровать и суммировать в одной и той же функции. Чистое решение всегда делает одно дело за раз. Здесь решение представлено в контексте автоматического c модульного теста:

test('62893326', () => {
  const input = [1, 3, 5, 7, 9, 11, 13, 15]
  const expected = [25, 11, 13, 15]
  const lower = input.filter(i => i < 10)
  const higher = input.filter(i => i >= 10)
  const sum = lower.reduce((accumulator, currentValue) => accumulator + currentValue)
  const result = [sum, ...higher]
  expect(result).toEqual(expected)
})

0 голосов
/ 14 июля 2020

Здесь используется функция фильтра, чтобы добавлять только те, которые больше 10, и суммировать меньшие. В конце сумма будет просто вставлена ​​в индекс 0 массива путем вызова Array.prototype.splice :

 const array = [1, 3, 5, 7, 9, 11, 13, 15];
 
 let underTen = 0;
 const minTen = array.filter(val => {
     if (val < 10) {
        underTen += val;
     } else {
        return val;
     }
});

// add sum at pos 1
minTen.splice(0, 0, underTen);
console.log(minTen);
0 голосов
/ 14 июля 2020

array.reduce - одна из современных функций, которые я не стараюсь использовать. Если честно, я не знаю, как это работает. И если DBS верна, вы тоже этого не сделаете. Так что вы можете сделать это простым способом.

for (var i=0, n=0, newArray = [];i<array.length;i++) {
    if (array[i] >= 10) {
        newArray.push(array[i]);
    } else {
        n += array[i];
    }
}
newArray.unshift(n);
0 голосов
/ 14 июля 2020

Если вы действительно хотите использовать Array.reduce:

const array = [1, 3, 5, 7, 9, 11, 13, 15];
let sum = 0;
const minTen = array.reduce((acc, currentValue) => {
        if (currentValue < 10) {
            sum += currentValue
        } else {
            acc = [...acc, currentValue]
        }
        return acc
}, []);

console.log([...minTen, sum]);

Но я не уверен, что это лучший метод для использования.

...