javascript - reduce 将数组合并为单个值

标签 javascript arrays reduce

我正在读一篇article here

reduce combines an array into a single value by repeatedly using a function that combines an element of the array with a base value. This is exactly what sum did, so it can be made shorter by using reduce... except that addition is an operator and not a function in JavaScript, so we first had to put it into a function.

function reduce(combine, base, array) {
  forEach(array, function (element) {
    base = combine(base, element);
  });
  return base;
}

function add(a, b) {
  return a + b;
}

function sum(numbers) {
  return reduce(add, 0, numbers);
}

function countZeroes(array) {
  function counter(total, element) {
    return total + (element === 0 ? 1 : 0);
  }
  return reduce(counter, 0, array);
}
  • reduce 将数组合并为单个值? :这是否意味着所有元素都被求和或连接?
  • 将数组的元素与基值组合? :组合所有元素还是一个元素?
  • 作者想解释什么?有人可以澄清这个概念吗?

最佳答案

reduce 操作的工作原理是迭代数组并向自定义回调提供一个累加器。该回调可以自由地对累加器进行任何它想要的操作。例如,累加器通常是回调添加的数字。因此,一组数字将减少为一个数字。

Array.prototype.reduce 实际上只是对此的抽象:

var acc = 0;
for (var i = 0; i < arr.length; i++) {
    acc += arr[i];
}

表示为减少:

var acc = arr.reduce(function (acc, n) {
    return acc + n;
});

显然,您不必使用+,您可以执行其他任何操作,例如:

var acc = [];
for (var i = 0; i < arr.length; i++) {
    acc.push(arr[i]);
}

var acc = arr.reduce(function (acc, n) {
    acc.push(n);
    return acc;
}, []);

结果是原始数组,没有任何内容被“减少”。 (是的,这毫无意义,但展示了你所拥有的自由。)

累加器只是回调在上一次迭代期间返回的值。归约操作的进行如下:

  • 回调采用空累加器*和数组的第一个值,返回值
  • 回调获取上一次迭代的返回值和数组的第二个值,返回值
  • [对数组中的每个元素重复]
  • reduce 将最后一个回调的结果作为reduce 操作的结果输出

* 有关首次迭代行为的详细信息,请参阅 API 文档。

关于javascript - reduce 将数组合并为单个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38218872/

相关文章:

javascript - 使用streams().reduce 从ArrayList<Integer> 构建一个字符串?

delphi - 如何减小 JPG 文件的大小?

javascript - 在 Javascript 中使用 Web 服务

javascript - 使用 ui-router 和 Angularjs 自动滚动到 TOP

javascript - 如何防止 ngInfiniteScroll 在初始触发后被多次触发?

python - 为什么从前面填充数组很慢?

javascript - nodeJs 回调简单示例

php - 无法从循环中为数组赋值

javascript - Internet Explorer 11 上的数组过滤

hadoop - 如何在hadoop reducer中编写不同格式的多个输出?