JavaScript数组减少到子数组的总和 - 为什么这不起作用?

The*_*ith 2 javascript arrays reduce multidimensional-array

reduce在JavaScript中尝试时,我没有得到预期的结果:

let x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];

x.reduce((a,b) => a.length + b.length, []);
Run Code Online (Sandbox Code Playgroud)

简单吧?这是我期望发生的事情,一步一步:

----------------------------------------------------------------
| callback | a (accumulator) | b (currentValue) | return value |
----------------------------------------------------------------
| 1st run  | 0               | 3                | 3            |
----------------------------------------------------------------
| 2nd run  | 3               | 3                | 6            |
----------------------------------------------------------------
| 2nd run  | 6               | 3                | 9            |
----------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

我到底得到了什么?NaN.在英语中,如果我理解正确,迭代器首先会查看我给它的初始值(空数组作为第二个参数reduce),并由参数表示a.我的代码显示了.length添加的两个参数的简单.我在哪里错了?

小智 10

我认为这是你要做的事情(变量重命名为清晰):

let x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];

x.reduce((acc,element) => acc + element.length, 0);
Run Code Online (Sandbox Code Playgroud)

这是如何逐步发生的:

--------------------------------------------------------------
| callback | acc | element   | element.length | return value |
--------------------------------------------------------------
| 1st run  | 0   | [1, 2, 3] | 3              | 3            |
--------------------------------------------------------------
| 2nd run  | 3   | [4, 5, 6] | 3              | 6            |
--------------------------------------------------------------
| 3rd run  | 6   | [7, 8, 9] | 3              | 9            |
--------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)


Poi*_*nty 6

.reduce()API预计回调函数将返回累加器值(在你的情况下,作为开始关闭值[])。您的回调只返回一个值。

为了使您的代码工作,您需要以下内容:

x.reduce((a,b) => { a.push(a.length + b.length); return a; }, []);
Run Code Online (Sandbox Code Playgroud)

现在,如果您真正想要的是数组长度的总和,那么无论如何您都不想累加到数组中;你想要一个简单的总和。而不是让累加器是一个数组,那么它只需要是一个数字:

var sum = x.reduce(((sum, array) => sum + array.length), 0);
Run Code Online (Sandbox Code Playgroud)

从零开始,每次调用该函数都会将数组长度添加到总和中。


The*_*ith 1

Pointy 上面的代码(实际上并没有像预期的那样返回 9)让我找到了这个可行的解决方案:

let x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
x.reduce((a,b) => a + b.length, 0);
Run Code Online (Sandbox Code Playgroud)

Meager 还在评论中指出,这是组合的一个经典案例map/reduce(一个更时尚的解决方案):

let x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
x.map(a => a.length).reduce((a,b) => a + b);
Run Code Online (Sandbox Code Playgroud)

  • 当您将初始起始值设置为零并且从不从回调返回数组时,“a”将永远不会是reduce中的数组请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/数组/归约 (3认同)