为什么我们不能在 Array.map() 中使用展开运算符,还有什么方法可以展平数组数组?

Why can't we use the spread operator within Array.map() and what are the alternative to flatten array of arrays?

这是我尝试过的:

let a = [[1,2], [3,4]];

a.map(val => ...val)
// => SyntaxError: expected expression, got '...'
// Expected output: [1,2,3,4]

我尝试使用显式 return 语句和带括号的周围值,但 none 有效...

我只是想知道是否有一种简单的方法可以 return "spreaded array" ?

编辑:现在我已经看到 它已经精确地说明了扩展运算符的工作原理,尽管它并没有真正回答关于如何 "flatten" 数组的问题(我修改了标题问题)。

尝试使用 a.flatMap(x=>x); 平面数组和映射元素或 flat(无映射)

a.flat();

let a = [[1,2], [3,4]];

let r=a.flat();

console.log(r);

flat arg 中,您可以设置扁平化的深层 - 设置 Infinity 将扁平化任何嵌套数组

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

let r=a.flat(Infinity);

console.log(r);

这不是有效的语法,要使其正常工作,您需要将数组("unpack" 的内容)散布到某种容器(例如数组)中。但是,如果您要执行以下操作:

a.map(val => [...val])

你会不会对你的数组做很多事情,相反,你最终会得到相同的数组。因此,您可以使用 .map 以外的其他方法,例如 .reduce.flatMap/.flat 来实现您想要的输出:

使用 .reduce 和扩展语法:

let a = [[1,2], [3,4]];

let res = a.reduce((acc, val) => [...acc, ...val], []);
console.log(res)

使用.flatMap():

let a = [[1,2], [3,4]];

let res = a.flatMap(val => val); // map the contents (without the holding array) [[1, 2], [3, 4]] -> [1, 2, [3, 4]] -> [1, 2, 3, 4]
console.log(res)

然而,

.flatMap() 在这里没有用,因此使用 .flat() 就足够了:

let a = [[1,2], [3,4]];

let res = a.flat();
console.log(res)

如果您只想展平二维数组,我建议您使用选项一 (.reduce),因为它具有最好的浏览器支持。 .flat().flatMap() 没有很好的浏览器支持,但可用于展平 n 维数组(如果需要,可以使用 .flat(Infinity)

正如评论中所写,函数只能return 一个值。

但是你可以使用一个简单的技巧:

let a = [[1,2], [3,4]];

a.reduce((a,b) => a.concat(b),[])
// Expected output: [1,2,3,4]