Map-Reduce:如何计算集合

时间:2017-01-03 16:46:35

标签: javascript arrays mapreduce reduce

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

我有一个数组,我只想使用mapreduce来计算验证布尔值的元素数。

数组大小的计数

我已经使用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)
);

4 个答案:

答案 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);