Map-Reduce:如何在集合中计数
Map-Reduce : How to count in a collection
重要编辑:我不能使用 filter
- 目的是教学。
我有一个数组,我想在其中计算验证布尔值的元素数量,仅使用 map
和 reduce
.
数组大小的计数
我已经写了一些计算数组大小的东西(即:所有元素的数量),使用reduce
:
const array_numbers = [12, 15, 1, 1]; // Size : 4
console.log(
array_numbers.reduce((acc) => {
return acc + 1;
}, 0)
);
检查布尔条件的数组元素数
现在我只想计算验证布尔条件的元素。因此,我必须在 reduce
之前使用 map
,并且 map
返回的数组的元素将只是好的元素。
所以我写了这段代码但是不行...确实遇到不好的元素我就放了null
(还有[=不幸的是,19=] 被算作 en 元素)。
注意:这里的布尔条件是 "is the element even ? (%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)
);
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);
您可以使用 Array.prototype.filter
来过滤 even 个数字 - 您不需要 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)
);
根据您的评论,由于某些原因您必须使用 reduce:
arr.reduce((acc, n) => { n % 2 ? acc + n : acc }, 0);
不需要地图。
正如 Jared Smith 所提到的,您不需要使用 map
来完成此任务。
Array.reduce()
获取当前元素作为回调函数中的第二个参数,您可以使用它来检查它是否满足您给定的条件。
因此,再次假设您 必须 使用 map
and/or 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);
重要编辑:我不能使用 filter
- 目的是教学。
我有一个数组,我想在其中计算验证布尔值的元素数量,仅使用 map
和 reduce
.
数组大小的计数
我已经写了一些计算数组大小的东西(即:所有元素的数量),使用reduce
:
const array_numbers = [12, 15, 1, 1]; // Size : 4
console.log(
array_numbers.reduce((acc) => {
return acc + 1;
}, 0)
);
检查布尔条件的数组元素数
现在我只想计算验证布尔条件的元素。因此,我必须在 reduce
之前使用 map
,并且 map
返回的数组的元素将只是好的元素。
所以我写了这段代码但是不行...确实遇到不好的元素我就放了null
(还有[=不幸的是,19=] 被算作 en 元素)。
注意:这里的布尔条件是 "is the element even ? (%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)
);
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);
您可以使用 Array.prototype.filter
来过滤 even 个数字 - 您不需要 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)
);
根据您的评论,由于某些原因您必须使用 reduce:
arr.reduce((acc, n) => { n % 2 ? acc + n : acc }, 0);
不需要地图。
正如 Jared Smith 所提到的,您不需要使用 map
来完成此任务。
Array.reduce()
获取当前元素作为回调函数中的第二个参数,您可以使用它来检查它是否满足您给定的条件。
因此,再次假设您 必须 使用 map
and/or 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);