计算对象中值的实例(array.reduce的初始值)

时间:2017-02-25 08:04:59

标签: javascript arrays object

我有以下代码来计算给定字符串中每个单词的数量:

function countWords(str) {
  if (str === "") {
    return {};
  }
  var holder = str.split(" ");
  var holder1 = holder.reduce(function (allNames, name) {
    if (name in allNames) {
      allNames[name]++;
    }
    else {
      allNames[name] = 1;
    }
    return allNames;
  }, {});
  return holder1;
}

countWords("Here I I am here here");

我理解代码中发生的一切,但我无法理解为什么我的测试都没有通过,除非我在逗号后面的第18行有空对象{}。有人可以解释一下这个目的吗?提前谢谢。

2 个答案:

答案 0 :(得分:0)

根据documentation

,因为定义了reduce的方式
  

array.reduce(callback,[initialValue])

其中callback是回调函数对数组中的每个值执行,取四个参数:

  

蓄能器:   之前在回调的最后一次调用中返回的累计值,如果提供的话,则返回initialValue。

     

CurrentValue的:   当前元素在数组中处理。

     

CURRENTINDEX:   数组中正在处理的当前元素的索引。如果提供了initialValue,则从索引0开始,否则从索引1开始。

     

数组:   调用了数组reduce。

重要提示就是:

  

第一次调用回调时,accumulator和currentValue可以是两个值之一。如果在reduce的调用中提供initialValue,则accumulator将等于initialValue,currentValue将等于数组中的第一个值。

     

如果没有提供initialValue,那么累加器将等于数组中的第一个值,currentValue将等于第二个值。

在您的代码中,holder var是:

holder = ["Here", "I", "I", "am", "here", "here"]

当我们将initialValue指定为空对象{}时(如第18行所示),我们首先进行迭代:

allNames = {}, name = "Here"

可以开始,因为allNames是一个数组,我们可以正确使用allNames[name]来计算每个单词的重复次数。

但是如果我们省略初始值,那么在第一次迭代中,我们将得到:

allNames = "Here", name = "I"

在我们的场景中完全错误。

答案 1 :(得分:0)

  • reduce method的语法为arr.reduce(callback, [initialValue]);

  • 回调函数可以使用4个accumulator, currentValue, currentIndex and array

  • 参数
  • 您在函数中只使用了两个参数,这很好。

    累加器 - 用于保存从上次回调调用返回的任何值 currentValue - 用于保存正在处理的当前值

  • 如果您还没有使用initialValue那么,对于第一次迭代,accumulator将保存数组中的第一个值,在您的情况下,该值将是字符串"Here"

var sum = ["a"].reduce(function(acc, val) {
  return acc;
});
console.log(sum);

  • 如果您使用initialValue并设置为object literal {},那么在第一次迭代中,accumulator将保留值initialValue

var sum = ["a"].reduce(function(acc, val) {
  return acc;
}, 5);
console.log(sum);