我知道它在最基本的例子中确实减少了(),但是没有像这样,特别是返回线。如果有人可以解释它是如何工作的,或者提出一个更容易理解的例子来返回相同的结果,那就太棒了。
var line = 'abazzzzax'
var obj = line.split('').reduce(function(p, c){
return (p[c] = ++p[c] || 1, p);
}, {});
console.log(obj)
// Output => { a: 3, b: 1, z: 4, x: 1 }
答案 0 :(得分:2)
函数的内部部分可以像这样重写:
var obj = line.split('').reduce(function(p, c){
if (!p[c]) {
p[c] = 1;
} else {
++p[c];
}
return p;
}, {});
拆分此表达式:
p[c] = ++p[c] || 1
当p[c]
尚不存在时,则值为undefined
。 ++(undefined)
返回NaN
这是一个虚假语句,因此p[c]
的值将为1.当p[c]
确实存在时,该值会递增,然后重新分配给本身。像i = ++i
这样的东西,在我看来有点令人困惑。
最后,逗号运算符允许您从左到右依次运行表达式,因此返回最终表达式,即跟踪事件的p
对象。
答案 1 :(得分:1)
reduce
函数在此示例中包含2个参数。
p
- >初始状态为{}
c
- >每次迭代的值a
,b
,a
.....
p[c] = ++p[c] || 1 //If the `key` is already available we increment it by 1 or set it to 1.
因此我们首先更新它并返回包含更新对象的p
,这是由逗号运算符引起的。
答案 2 :(得分:1)
它计算字符串中每个字符的出现次数。
基本上
if accumulator[character] exists, increase number stored in accumulator[character] by 1 (this happens if we have set it already to 1, somewhere in the past, because otherwise it will not exist)
else set accumulator[character] to 1 (this happens when we notice a first character of a new kind)
return accumulator object