Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Reduce将数组转换为对象_Javascript_Functional Programming - Fatal编程技术网

Javascript 使用Reduce将数组转换为对象

Javascript 使用Reduce将数组转换为对象,javascript,functional-programming,Javascript,Functional Programming,有人能解释一下这是怎么回事吗 学习使用Array.reduce reduce的工作方式与map或filter非常相似。在这种情况下,reducer负责将对象数组缩减为一个对象 reducer函数遍历数组的所有元素。该函数由两个参数调用,一个是Tall—到目前为止减少的结果,另一个是vote—当前正在处理的数组元素 如果tally没有一个与当前正在处理/缩减的元素名称相同的属性,它会向对象添加这样一个键,并将其值设置为1。否则键存在,它将递增1 有关更多信息,请参见reduce的工作方式与map或

有人能解释一下这是怎么回事吗

学习使用Array.reduce


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