重要编辑:我无法使用filter
- 目的是教学法。
我有一个数组,我只想使用map
和reduce
来计算验证布尔值的元素数。
我已经使用reduce
编写了一些计算数组大小(即:所有元素的数量)的内容:
const array_numbers = [12, 15, 1, 1]; // Size : 4
console.log(
array_numbers.reduce((acc) => {
return acc + 1;
}, 0)
);
现在我想要只计算验证布尔条件的元素。因此,我必须在map
之前使用reduce
,并且map
返回的数组的元素将只是好元素。
所以我写了这段代码,但它不起作用...... 确实,当我遇到一个不太好的元素时我放null
(并计算null
不幸的是,作为en元素。)
注意:这里,布尔条件是“元素是否均匀?(%2 == 0)”。
const array_numbers = [12, 15, 1, 1]; // Size : 4
console.log(
array_numbers.map((current_value) => {
if(current_value % 2 == 0) {
return current_value;
}
return null;
}).reduce((acc) => {
return acc + 1;
}, 0)
);
答案 0 :(得分:3)
Array#filter
数组并检查长度:
const array_numbers = [12, 15, 1, 1];
const result = array_numbers.filter((n) => n % 2 === 0).length;
console.log(result);

使用Array#reduce
计算:
const array_numbers = [12, 15, 1, 1, 4];
const result = array_numbers.reduce((r, n) => n % 2 ? r : r + 1, 0);
console.log(result);

或者如果必须,您可以Array#map
使用Array#reduce
:
const array_numbers = [12, 15, 1, 1, 4];
const result = array_numbers
.map((n) => n % 2 === 0 ? 1 : 0) // map to 1 or 0 according to the condition
.reduce((r, n) => r + n); // sum everything
console.log(result);

答案 1 :(得分:1)
您可以使用Array.prototype.filter
过滤甚至号码 - 而且您不需要reduce()
功能 - 您可以使用返回的数组的length
通过filter()
函数。
或者您可以单独使用reduce()
方法,如下所示:
见下面的演示:
const array_numbers = [12, 15, 1, 1]; // Size : 4
// using filter
console.log(
array_numbers.filter((current_value) => {
return current_value % 2 == 0;
}).length
);
// using reduce
console.log(
array_numbers.reduce((prev, curr) => {
return curr % 2 == 0 ? prev + 1 : prev;
}, 0)
);
答案 2 :(得分:1)
根据您的评论,您必须出于某种原因使用reduce:
arr.reduce((acc, n) => { n % 2 ? acc + n : acc }, 0);
地图是不必要的。
答案 3 :(得分:1)
正如Jared Smith所提到的,您不需要使用map
来执行此任务。
Array.reduce()
将当前元素作为回调函数中的第二个参数,您可以使用它来检查它是否满足您给定的条件。
因此,再次假设您必须使用map
和/或reduce
:
const myArray = [1,2,3,4,5,6];
const condition = function(a) {
// let's say
return a %2 == 0;
}
let result = myArray.reduce((acc, val) => {
return condition(val) ? acc + 1 : acc
}, 0);
console.log(result);