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)
该.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)
从零开始,每次调用该函数都会将数组长度添加到总和中。
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)
| 归档时间: |
|
| 查看次数: |
2553 次 |
| 最近记录: |