我正在阅读javascript中reduce函数的文档,我在这个例子中遇到了困难。
var names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];
var countedNames = names.reduce(function(allNames, name) {
if (name in allNames) {
allNames[name]++;
} else {
allNames[name] = 1;
}
return allNames;
}, {});
console.log(countedNames);
如何输出:
{' Alice':2,' Bob':1,' Tiff':1,' Bruce':1}
而不是
{2,1,1,1}
答案 0 :(得分:1)
您正在将一个匿名函数和一个空对象传递给reduce方法。如果您查看MDN上的文档以进行reduce: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
您可以看到它接受回调函数和初始值。在这种情况下,您将传递一个空对象var names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];
var countedNames = names.reduce(function(allNames, name) {
if (name in allNames) { //first time through, allNames = {}
allNames[name]++; //if name is present as key in allNames object, increment the value by 1
} else {
allNames[name] = 1; //first time through now allNames = {'Alice': 1 }
}
return allNames;
}, {}); //initialize allNames with empty object
作为初始值(请参见倒数第二行)
{}
方法然后“对累加器和数组的每个值(从左到右)应用函数以将其减少为单个值。”
此单个值以空对象开头,然后根据回调函数体内的条件逻辑,在此对象中添加和增加属性。
你的专栏:
reduce
用于创建名为allNames[name] = 1
的属性,并为该属性指定值1。
这一行:
name
简单地增加现有属性。
我会进一步建议代码示例缺少可进一步澄清代码的格式:
allNames[name] += 1;
答案 1 :(得分:0)
因此reduce
会占用array
并将其降低为单个值。在您的情况下,您将reduce
个array
个名称归结为一个哈希,其中包含array
中名称和该名称存在次数的计数。 reduce
的最后一个参数是初始起始值。在这种情况下,你给它一个空的object
。这个object
在回调函数中由allNames
表示。因此,对于name
中的每个array
,如果allNames
已存在,请检入name
。如果是,则递增name
的计数,否则将其设置为1
。
答案 2 :(得分:0)
reduce函数以一个起始值开始,后续"减少"传入数据将提供修改。在这种情况下,起始值是{}
,即对象文字,来自代码的第二行。在这种情况下,将应用所有新修改的逐渐累积值称为allNames
。当reduce
函数对allNames[name]
执行某些操作时,它会对allNames
对象的属性执行某些操作,该对象的键为name
,例如'Alice'
。 Alice
。因此,例如,第一次遇到Alice的名字时,创建其密钥为1
的属性并为其分配值export default const FOO = 'FOO'
。这将继续通过原始输入,最终产生您指出的最终结果。
答案 3 :(得分:0)
string.find_first_of(integer);
string.find_last_not_of(integer);
是一个累加器函数 - 它将遍历数组中的所有元素并对它们执行一些操作以将它们减少为单个值。在此示例中,我们将单个值初始化为空对象Array.prototype.reduce()
。当我们遍历名称时,我们检查对象中是否已存在该名称作为键 - 如果是,则我们递增计数,如果不存在,则我们将该键值对初始化为allnames = {}
:
<name>: 1