Javascript 使用Reduce将数组转换为对象
有人能解释一下这是怎么回事吗 学习使用Array.reduceJavascript 使用Reduce将数组转换为对象,javascript,functional-programming,Javascript,Functional Programming,有人能解释一下这是怎么回事吗 学习使用Array.reduce reduce的工作方式与map或filter非常相似。在这种情况下,reducer负责将对象数组缩减为一个对象 reducer函数遍历数组的所有元素。该函数由两个参数调用,一个是Tall—到目前为止减少的结果,另一个是vote—当前正在处理的数组元素 如果tally没有一个与当前正在处理/缩减的元素名称相同的属性,它会向对象添加这样一个键,并将其值设置为1。否则键存在,它将递增1 有关更多信息,请参见reduce的工作方式与map或
reduce的工作方式与map或filter非常相似。在这种情况下,reducer负责将对象数组缩减为一个对象 reducer函数遍历数组的所有元素。该函数由两个参数调用,一个是Tall—到目前为止减少的结果,另一个是vote—当前正在处理的数组元素 如果tally没有一个与当前正在处理/缩减的元素名称相同的属性,它会向对象添加这样一个键,并将其值设置为1。否则键存在,它将递增1
有关更多信息,请参见reduce的工作方式与map或filter非常相似。在这种情况下,reducer负责将对象数组缩减为一个对象 reducer函数遍历数组的所有元素。该函数由两个参数调用,一个是Tall—到目前为止减少的结果,另一个是vote—当前正在处理的数组元素 如果tally没有一个与当前正在处理/缩减的元素名称相同的属性,它会向对象添加这样一个键,并将其值设置为1。否则键存在,它将递增1 有关详细信息,请转到Array.prototype.reduce方法对累加器和数组的每个值应用函数,以将其减少为单个值 在您的示例中,计数操作结果的缩减值被指定为名为tally的对象的属性,该对象由.reduce返回 我对你的评论作了简短的解释: //将数据放入数组中 var票数=[“塔可”、“比萨饼”、“比萨饼”、“塔可”、“薯条”、“冰淇淋”、“冰淇淋”、“比萨饼”]; //使用Array.prototype.reduce时用作回调的第一个调用的第一个参数的可选值。 var initialValue={} //tally=以前的值,vote=当前值 var减速机=功能计数、投票{ //若tally未指定为tally对象中的键,则添加键并添加值1,基本上为投票数组中的一个元素计算1 如果!计数[投票]{ 计票[投票]=1; }否则{ //否则,如果tally对象已经有这个键,则将其值增加1,基本上它会计算投票数组中的每个项在数组中出现的次数 计票[投票]=计票[投票]+1; } 返回理货; } var结果=投票数。还原还原器,初始值; console.logresult 基本上,Array.prototype.reduce方法对累加器和数组的每个值应用一个函数,以将其减少为单个值 在您的示例中,计数操作结果的缩减值被指定为名为tally的对象的属性,该对象由.reduce返回 我对你的评论作了简短的解释: //将数据放入数组中 var票数=[“塔可”、“比萨饼”、“比萨饼”、“塔可”、“薯条”、“冰淇淋”、“冰淇淋”、“比萨饼”]; //使用Array.prototype.reduce时用作回调的第一个调用的第一个参数的可选值。 var initialValue={} //tally=以前的值,vote=当前值 var减速机=功能计数、投票{ //若tally未指定为tally对象中的键,则添加键并添加值1,基本上为投票数组中的一个元素计算1 如果!计数[投票]{ 计票[投票]=1; }否则{ //否则,如果tally对象已经有这个键,则将其值增加1,基本上它会计算投票数组中的每个项在数组中出现的次数 计票[投票]=计票[投票]+1; } 返回理货; } var结果=投票数。还原还原器,初始值;
console.logresult 我在您的代码中插入了一些console.log消息,这有助于我了解发生了什么 var投票=['tacos','pizza','pizza','tacos','fries','ice cream','ice cream','pizza']; var initialValue={} var减速机=功能计数、投票{ console.logtally:,tally; console.logvote:,vote; console.logtally[vote]:,tally[vote]; 如果!计数[投票]{ 计票[投票]=1; }否则{ 计票[投票]=计票[投票]+1; } 返回理货; } var结果=投票数。还原还原器,初始值
console.logresult:+JSON.stringifyresult 我在您的代码中插入了一些console.log消息,这有助于我了解发生了什么 var投票=['tacos','pizza','pizza','tacos','fries','ice cream','ice cream','pizza']; var initialValue={} var减速机=功能计数、投票{ console.logtally:,tally; console.logvote:,vote; console.logtally[vote]:,tally[vote]; 如果!计数[投票]{ 计票[投票]=1; }否则{ 计票[投票]=计票[投票]+1; } 返回理货; } var结果=投票数。还原还原器,初始值 console.logresult:+JSO N.严格化结果 reduce方法将数组缩减为单个值 reduce方法从左到右为数组的每个值执行提供的函数 函数的返回值存储在累加器结果/总计中 您拥有以下给定列表: 然后你做一个初始列表。您可以对此进行修改,该函数将应用于两个列表 reducer被初始化为一个函数。我们将函数放在reducer中的原因是为了更容易地调用它。您可以在这个函数中执行任何您想执行的操作,它将在接下来的步骤中在列表中执行 最后,函数的结果存储到变量中
var result = votes.reduce(reducer, initialValue)
reduce方法将数组缩减为单个值
reduce方法从左到右为数组的每个值执行提供的函数
函数的返回值存储在累加器结果/总计中
您拥有以下给定列表:
然后你做一个初始列表。您可以对此进行修改,该函数将应用于两个列表
reducer被初始化为一个函数。我们将函数放在reducer中的原因是为了更容易地调用它。您可以在这个函数中执行任何您想执行的操作,它将在接下来的步骤中在列表中执行
最后,函数的结果存储到变量中
var result = votes.reduce(reducer, initialValue)
那么,让我们尝试扩展迭代: 当你执行
votes.reduce(reducer, initialValue)
它实际上是这样做的:
reducer(initialValue, votes[0]); // step1, return {'tacos': 1}
reducer(returnedValueOfStep1, votes[1]); // step2, return {'tacos': 1, 'pizza': 1}
reducer(returnedValueOfStep2, votes[2]); // step3, return {'tacos': 1, 'pizza': 2}
reducer(returnedValueOfStep3, votes[3]); // step4 ...
reducer(returnedValueOfStep4, votes[4]); // step5 ...
reducer(returnedValueOfStep5, votes[5]); // step6 ...
reducer(returnedValueOfStep6, votes[6]); // step7 ...
reducer(returnedValueOfStep7, votes[7]); // step8 ...
我想现在已经很清楚了
通常,如果我们不提供initialValue作为reduce的第二个参数,它将以数组的第一个元素作为initialValue,并从第二个元素开始迭代:
reducer(votes[0], votes[1]); // step1 ...
reducer(returnedValueOfStep1, votes[2]); // step2 ...
...
那么,让我们尝试扩展迭代: 当你执行
votes.reduce(reducer, initialValue)
它实际上是这样做的:
reducer(initialValue, votes[0]); // step1, return {'tacos': 1}
reducer(returnedValueOfStep1, votes[1]); // step2, return {'tacos': 1, 'pizza': 1}
reducer(returnedValueOfStep2, votes[2]); // step3, return {'tacos': 1, 'pizza': 2}
reducer(returnedValueOfStep3, votes[3]); // step4 ...
reducer(returnedValueOfStep4, votes[4]); // step5 ...
reducer(returnedValueOfStep5, votes[5]); // step6 ...
reducer(returnedValueOfStep6, votes[6]); // step7 ...
reducer(returnedValueOfStep7, votes[7]); // step8 ...
我想现在已经很清楚了
通常,如果我们不提供initialValue作为reduce的第二个参数,它将以数组的第一个元素作为initialValue,并从第二个元素开始迭代:
reducer(votes[0], votes[1]); // step1 ...
reducer(returnedValueOfStep1, votes[2]); // step2 ...
...
这里和其他地方有很多关于reduce的详细解释,但我认为一个简单的视觉演示可能会有所帮助
[1,2,3].reduce(function(a,b) { return a + b }, 0)
// (((0 + 1) + 2) + 3)
// => 6
你可以看到:
由3个元素组成的输入列表将导致3次计算
初始值用于第一个元素的计算
一次计算的结果将用于下一次计算…
…直到最后一次计算,这是reduce的结果
至于你的代码,我们不是在构建一个数字之和,而是在构建一个对象,它保存数组中每个字符串的计数
我没有必要解释其他人都做了什么,但这可能会让你感到困惑也就不足为奇了,因为没有人解释这是对对象的滥用
事实上,对于这种简化,对象实际上不是最佳的数据结构选择。这里,一个对象用于模拟一个对象的行为
我们将initialValue设置为一个新映射,您将看到reducer如何在其中使用更具描述性的语法。注意注释甚至不是必需的,因为代码说明了它所需要的一切
var投票=[“塔可”、“比萨饼”、“比萨饼”、“塔可”、“薯条”、“冰淇淋”、“冰淇淋”、“比萨饼”]
var initialValue=新映射
var减速机=功能计数,表决{
如果你有投票权
返回tally.setvote,tally.getvote+1
其他的
返回tally.setvote,1
}
var结果=投票数。还原还原器,初始值
console.logArray.fromresult.entries这里和其他地方对reduce有很多详细的解释,但我认为一个简单的可视化演示可能会有所帮助
[1,2,3].reduce(function(a,b) { return a + b }, 0)
// (((0 + 1) + 2) + 3)
// => 6
你可以看到:
由3个元素组成的输入列表将导致3次计算
初始值用于第一个元素的计算
一次计算的结果将用于下一次计算…
…直到最后一次计算,这是reduce的结果
至于你的代码,我们不是在构建一个数字之和,而是在构建一个对象,它保存数组中每个字符串的计数
我没有必要解释其他人都做了什么,但这可能会让你感到困惑也就不足为奇了,因为没有人解释这是对对象的滥用
事实上,对于这种简化,对象实际上不是最佳的数据结构选择。这里,一个对象用于模拟一个对象的行为
我们将initialValue设置为一个新映射,您将看到reducer如何在其中使用更具描述性的语法。注意注释甚至不是必需的,因为代码说明了它所需要的一切
var投票=[“塔可”、“比萨饼”、“比萨饼”、“塔可”、“薯条”、“冰淇淋”、“冰淇淋”、“比萨饼”]
var initialValue=新映射
var减速机=功能计数,表决{
如果你有投票权
返回tally.setvote,tally.getvote+1
其他的
返回tally.setvote,1
}
var结果=投票数。还原还原器,初始值
console.logArray.fromresult。entries@JörgWMittag这怎么太宽了?@JörgWMittag这怎么太宽了?如果
!tally[投票]{tally[投票]=1;}我对这首歌感到困惑value@SiddharthArora基本上它说:如果你考虑的值还没有被计算,开始计算它,加上1的值。例如,当您开始处理数组投票,发现第一次吃玉米卷时,该项目尚未计数,因此它将添加到值为1的Tall对象中,第二次值pizza也是如此。对于第三个值pizza,该值已在对象Tall中找到,因此它将增加其值1 tally[vote]=tally[vote]+1;。。。。我希望它能有所帮助。让我知道。谢谢真的很抱歉,伙计,我对如何为对象中的属性赋值感到困惑。到目前为止,我只知道.dot符号。谢谢@GibboK@SiddharthArora不客气。是的,在JS中,您可以通过点符号或方括号符号访问属性,这对于动态查找非常方便。您可以通过以下链接了解有关属性访问器的更多信息。我很高兴我的回答帮你解答了你的问题。如果tally[投票]{tally[投票]=1;}我对这首歌感到困惑value@SiddharthArora基本上它说:如果你考虑的值还没有被计算,开始计算它,加上1的值。例如,当您开始处理数组投票,发现第一次吃玉米卷时,该项目尚未计数,因此它将添加到值为1的Tall对象中,第二次值pizza也是如此。对于第三个值pizza,该值已在对象Tall中找到,因此它将增加其值1 tally[vote]=tally[vote]+1;。。。。我希望它能有所帮助。让我知道。谢谢真的很抱歉,伙计,我对如何为对象中的属性赋值感到困惑。到目前为止,我只知道.dot符号。谢谢@GibboK@SiddharthArora不客气。是的,在JS中,您可以通过点符号或方括号符号访问属性,这对于动态查找非常方便。您可以通过以下链接了解有关属性访问器的更多信息。我很高兴我的回答帮你解答了你的问题。你可以在这里嵌入代码片段。也不需要在场外托管或打开开发者控制台。@naomik:你说得对。我编辑了我的答案。谢谢。你可以在这里嵌入代码片段。也不需要在场外托管或打开开发者控制台。@naomik:你说得对。我编辑了我的答案。谢谢。噢,我真的很抱歉。谢谢沃曼:@naomikoops:D.我真的很抱歉。谢谢沃曼:@naomik