Map-Reduce:如何在集合中计数

Map-Reduce : How to count in a collection

重要编辑:我不能使用 filter - 目的是教学。

我有一个数组,我想在其中计算验证布尔值的元素数量,仅使用 mapreduce.

数组大小的计数

我已经写了一些计算数组大小的东西(即:所有元素的数量),使用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#mapArray#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() 函数 - 您可以使用 lengthfilter() 函数返回的数组。

或者您可以单独使用 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);