我写了一个函数,用concat和reduce方法从eloquent javascript中平铺一个数组。当我这样写我的代码时。
function flatten(args){
return args.reduce((current,i) =>{
current.concat(i);
},[] );
}
let arrays = [[1, 2, 3], [4, 5], [6]];
console.log(flatten(arrays));
我得到了以下错误:
current.concat(i);
^
TypeError: Cannot read property 'concat' of undefined
但是当我把这部分的大括号"{}"去掉的时候:
before:
return args.reduce((current,i) =>{
current.concat(i);
},[] );
后:
return args.reduce((current,i) =>
current.concat(i)
,[] );
}
打印出来就好了。当找到初始化为0的和时,这种格式工作得很好。当[]在大括号'{}'中时,concat方法是否不能识别。
简短的回答:是的,这是不同的。你的reducer需要在函数中返回一个值。的值。current
参数等于上次调用reduce函数的最后一次返回。在第一次调用中, current
参数等于 reduce 函数调用的第二个参数中指定的初始值(即)。[]
).
明确返回 current
的大括号版本也能解决这个问题。
function flatten(args) {
return args.reduce((current, i) => {
return current.concat(i);
}, []);
}
如果不加大括号,返回值就会隐含地返回concat表达式所返回的值,也就是一个新数组。
有关箭头函数工作原理的更多信息,请查看 MDN的箭头功能文章. 具体来说,本节讲的是如何暗示。
(param1, param2, …, paramN) => expression
// equivalent to: => { return expression; }
以及这一节:
// When the only statement in an arrow function is `return`, we can remove `return` and remove
// the surrounding curly brackets
elements.map(element => element.length); // [8, 6, 7, 9]