在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
。我在哪里错了?
答案 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);