筛选特定数字并求和



给定:

我有一个数组,看起来像这样:

[1, 1, 3, 3, 3, 2, 2, 1, 3, 3, 2, 3, 4, 2, 3, 4, 4, 2, 1, 3, 2, 4, 3, 2];

我需要什么:

scoreN = sum up all numbers with one
scoreST = sup all numbers with two
scoreO = sum up all numbers with three
scoreAA = sum up all numbers with four
totalScore = scoreN + scoreST + scoreO + scoreAA

问题:

什么是最简单的(初学者友好的(JS代码来过滤数字并获得总和?

const数组=[1,1,3,3,3,2,1,3,2,3,4,2,3,4,4,2,3,2,2,3,4,3,2];

类似的东西?

const scoreN = array.filter(1);
const scoreST = array.filter(2);
const scoreO = array.filter(3);
const scoreAA = array.filter(4);
const totalScore = scoreN + scoreST + scoreO + scoreAA

您的方法非常正确。

但是数组方法filter采用了一个函数,您可以用lambda函数x => x === 1来表示该函数,其中参数x表示当前数组值。返回值应该是布尔值,在这种情况下,我们希望所有数字都等于1。

函数reduce接受两个参数,一个是具有前一个值和当前值的函数,如果数组为空,则为默认值。在这种情况下,如果没有要求和的元素,则为0。

const numbers = [1, 1, 3, 3, 3, 2, 2, 1, 3, 3, 2, 3, 4, 2, 3, 4, 4, 2, 1, 3, 2, 4, 3, 2];
const sum = (a, b) => a + b;
const scoreN = numbers.filter(x => x === 1).reduce(sum, 0);
const scoreST = numbers.filter(x => x === 2).reduce(sum, 0);
const scoreO = numbers.filter(x => x === 3).reduce(sum, 0);
const scoreAA = numbers.filter(x => x === 4).reduce(sum, 0);
const total = scoreN + scoreST + scoreO + scoreAA;
console.log(total);

是的,使用filter可以向下过滤数组。但是,如果使用reduce,则可以同时进行筛选和求和。例如:

const scoreN = numbers.reduce((sum, val) => {
if (val === 1) {
sum += val;
}
return sum;
}, 0);

对于大多数类c语言来说,最适合初学者的代码是:

function score(array, value) {  
let sum = 0;
for (let i = 0; i < array.length; i++) {
let element = array[i];
if (element === value) {
sum += element;
}
}
return sum;
}

另一个使用JS数组函数的解决方案是:

function score(array, value) {
let sum = array
.filter(e => e === value)
.reduce((prev, curr) => prev + curr, 0);
return sum;
}

您将以相同的方式使用这两个功能:

const scoreN = score(array, 1);
const scoreST = score(array, 2);
const scoreO = score(array, 3);
const scoreAA = score(array, 4);
const totalScore = scoreN + scoreST + scoreO + scoreAA;

最新更新