如何制作Javascript's减少对数组数组的方法工作

How can I make Javascript's reduce method work on arrays of arrays?

本文关键字:数组 工作 方法 Javascript 何制作      更新时间:2023-09-26

原始问题

我正在做一个练习,该练习应该总结收银机中剩余的零钱量,变量为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"

两个问题

  1. 有什么方法可以有效地将reduce方法用于这样的多维数组吗
  2. 有人能帮我了解一下引擎盖下面发生了什么吗

您对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将数字强制转换为字符串,然后将它们连接起来。