如何制作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语句试图减少一个字符串和一个数字。在js
    0+中,“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;
    });