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

时间:2017-01-02 04:04:23

标签: javascript arrays multidimensional-array reduce

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

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

x.reduce((a,b) => a.length + b.length, []);

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

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

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

4 个答案:

答案 0 :(得分:7)

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

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

x.reduce((acc,element) => acc + element.length, 0);

这是如何逐步发生的:

--------------------------------------------------------------
| 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            |
--------------------------------------------------------------

答案 1 :(得分:1)

.reduce() API期望您的回调函数将返回累加器值(在您的情况下,以[]开头的值)。你的回调只返回一个值。

要使代码正常工作,您需要以下内容:

x.reduce((a,b) => { a.push(a.length + b.length); return a; }, []);

现在,如果真正想要的是数组长度的总和,那么你也不想累积到数组中;你想要一个简单的总和。不要将累加器作为数组,而只需要一个数字:

var sum = x.reduce(((sum, array) => sum + array.length), 0);

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

答案 2 :(得分:1)

作为使用dog=read(dog.jpg) fish=read(fish.jpg) lizard=read(lizard.jpg) 的替代方法,展平数组并获取结果的长度。

reduce

上面function flatten(a) { return [].concat(...a); } const x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]; const length = flatten(x).length; console.log(length);的实现适用于深度为1或2的数组。根据需要扩展/替换更深层嵌套的数组。

答案 3 :(得分:0)

上面的Pointy代码(实际上并没有像预期那样返回9)让我进入这个有效的解决方案:

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

Meager在评论中也指出,这是map/reduce组合的经典案例(更简洁的解决方案):

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