如何制作Javascript';如何减少数组的数组上的工作? 原始问题
我正在做一个练习,应该总结收银机中剩余的零钱,变量如何制作Javascript';如何减少数组的数组上的工作? 原始问题,javascript,arrays,Javascript,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(prev
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
时,并不是像我想象的那样,简单地深入数组/对象一层
然而,我唯一怀疑的另一件事也是错误的:它也没有深入研究所有的层次。如果是这样的话,我本以为会看到这样的情况(注意,没有逗号):
两个问题
reduce
方法用于这样的多维数组以下几点应该有效
cid.reduce( (memo, item) => memo + item[1], 0)
或
您稍微误解了
reduce
的本质;prevVal
中的值不是上次调用的值;这是我们上次返回的值。由于您返回的是一个整数,prevVal
是一个整数,prevVal[1]
是undefined
我建议您更改对reduce
的调用,以提供显式默认值0
,并重写函数,假定prevVal
始终是一个数字,而不是数组中的值
var-cid=[
[“便士”,0],
[“镍”,0],
[“一角”,0],
[“四分之一”,0],
[“一”,0],
[“五”,0],
[“十”,0],
[“二十”,0],
[“一百”,0]
]
var val=cid.REDUCT(函数(prevVal、curVal){
返回preval+curVal[1];
}, 0);
document.write(“+JSON.stringify(val)+”)代码>没有人向你解释“引擎盖下”发生了什么,所以我要试一试
cid.reduce(function(prevVal, curVal) {
return prevVal[1] + curVal[1];
});
NaN
所以这基本上就是正在发生的事情:
cid.reduce(function(prevVal, curVal) {
return prevVal + curVal;
});
在本例中,您获取了两个javascript试图强制的数组,结果是NaN
在这里:
它减少每个数组中的每个元素,但return语句试图减少一个字符串和一个数字。在js0+中,“string”
是0string,因为js将数字强制为一个字符串,然后将其连接起来。array+array===array.toString()+array.toString()
下面的两个答案确定了它-只是想指出,您实际上返回了您拥有的硬币/纸币的数量,这不是他们的价值。那应该是[[“便士”,0],“镍币”,0],“一角”,0],“四分之一”,0],“一”,0],“五”,0],“十”,0],“二十”,0],“一百”,0],
或[“便士”,0],“镍”,0],“一角,0],“四分之一”,“一”,0],“五”,0],“十”,0],“二十”,0],“一百”,0],
@phenjdix No,事实并非如此。我打错了,现在已经修好了。很抱歉给您带来任何困惑。是的,谢谢!我确实误解了prevVal
在reduce
中真正代表的微妙方面。您解释它的方式非常好,reduce
的实现非常有意义。谢谢,但我仍然感到困惑。接近尾声时,你说0+“string”
是0string
,这正是我所想的,但这不是我所看到的。相反,它以某种方式强制并创建了一个逗号。这是我真正困惑的部分。另外,我认为我在两次尝试中都获取了两个数组,只是第一次尝试我进一步尝试将其缩减为单个值@哈姆斯的解释对我来说仍然最有意义:preval
变成了一个整数,因为它是返回值,而curVal
仍然是一个必须是子集的数组。
cid.reduce(function(prevVal, curVal) {
return prevVal[1] + curVal[1];
});
NaN
cid.reduce(function(prevVal, curVal) {
return prevVal + curVal;
});