如何制作Javascript's减少对数组数组的方法工作
How can I make Javascript's reduce method work on arrays of arrays?
原始问题
我正在做一个练习,该练习应该总结收银机中剩余的零钱量,变量为cid
。
cid
看起来像这样:
var cid = [["PENNY", 0], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]];
在这种情况下,当所有值都为0时,我应该报告寄存器为空。
我认为这样的东西应该起作用:
if (cid.reduce(function(prevVal, curVal) {
return prevVal[1] + curVal[1];
}) === 0)
但事实并非如此。
挖掘
在使用数组中的数组和reduce
方法时,似乎会发生一些奇怪的事情。例如:
cid.reduce(function(prevVal, curVal) {
return prevVal[1] + curVal[1];
});
NaN
然而,如果我让整个阵列通过,我确实会得到一些东西,尽管有些奇怪:
cid.reduce(function(prevVal, curVal) {
return prevVal + curVal;
});
"PENNY,0NICKEL,0DIME,0QUARTER,0ONE,0FIVE,0TEN,0TWENTY,0ONE HUNDRED,0"
我很清楚,当使用reduce
时,它并不像我所怀疑的那样,简单地对数组/对象深入一个级别。
然而,我可能怀疑的唯一一件事也是错误的:它也没有深入研究所有级别。如果是这样的话,我本以为会看到这样的东西(注意没有逗号):
"PENNY0NICKEL0DIME0QUARTER0ONE0FIVE0TEN0TWENTY0ONE HUNDRED0"
两个问题
- 有什么方法可以有效地将
reduce
方法用于这样的多维数组吗 - 有人能帮我了解一下引擎盖下面发生了什么吗
您对reduce
的性质有点误解;CCD_ 7中的值不是我们上次调用的值;它是我们上次返回的值。由于返回的是整数,所以prevVal
是整数,prevVal[1]
是undefined
。
我建议您更改对reduce
的调用,以提供0
的显式默认值,并重写函数,假设prevVal
是始终将是一个数字,而不是数组中的值。
var cid = [
["PENNY", 0],
["NICKEL", 0],
["DIME", 0],
["QUARTER", 0],
["ONE", 0],
["FIVE", 0],
["TEN", 0],
["TWENTY", 0],
["ONE HUNDRED", 0]
]
var val = cid.reduce(function(prevVal, curVal) {
return prevVal + curVal[1];
}, 0);
document.write("<pre>" + JSON.stringify(val) + '</pre>');
以下内容应适用于
cid.reduce( (memo, item) => memo + item[1], 0)
或
cid.reduce( function(memo, item) { return memo + item[1] }, 0)
没有人向你解释"引擎盖下"发生了什么,所以我要试一试。
所以这基本上就是正在发生的事情:
cid.reduce(function(prevVal, curVal) {
return prevVal[1] + curVal[1];
});
NaN
在这种情况下,您正在获取javascript试图强制的两个数组,结果是NaN
此处:
cid.reduce(function(prevVal, curVal) {
return prevVal + curVal;
});
它减少了每个数组中的每个元素,但return语句试图减少一个字符串和一个数字。在js中,0 + "string"
是0string,因为js将数字强制转换为字符串,然后将它们连接起来。
相关文章:
- Var工作,但在使用数组执行相同操作时停止
- 2D数组在Angular JS 1.2.x中工作,而不是在1.3.x中工作
- 为什么AngularJS$scope.watch()在我告诉它监视数组时会停止工作
- 如何制作Javascript's减少对数组数组的方法工作
- 试着让数组工作
- 如何让Knockout可观察数组与jQuery对话框一起工作
- 当许多元素相等时,Javascript数组排序无法正常工作
- AngularStrap Select和ng选项don'使用动态数组不能很好地工作
- 从数组中随机选择,但在for循环中选择是不可能的;没有按预期工作
- map() 函数如何在数组上工作
- Javascript数组未按预期工作
- 如何在谷歌工作表中使用数组公式时使用getLastRow.我可以让它忽略一列吗
- Web工作程序在处理大型数组时内存不足
- Polymer v1.3.1数据绑定无论是否使用带有重复模板和json数组的iron ajax都无法工作
- Knockout.js多个可观察数组不工作
- 解析数组时 for 循环无法正常工作
- ngRepeat:dupes 使用名为“name”的数组在中继器中复制键.用其他名称,它是工作
- 谷歌地图API v3动态标记,帮助使数组工作
- js 数组排序无法正常工作
- JavaScript发送变量,但插入数组PHP不能正常工作