我有以下代码来计算给定字符串中每个单词的数量:
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行有空对象{}
。有人可以解释一下这个目的吗?提前谢谢。
答案 0 :(得分:0)
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);