为什么我们不能在Array.map()中使用散布运算符?扁平化数组数组的替代方法是什么?

时间:2019-02-18 11:23:19

标签: javascript spread-syntax

这是我尝试过的:

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

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

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

我只是想知道是否有一种简单的方法可以返回“扩展数组”?

编辑:现在我看到this SO question可以精确地知道散布运算符的工作原理,尽管并没有真正回答如何“展平”数组的问题(我修改了问题的标题)。

3 个答案:

答案 0 :(得分:3)

尝试使用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);

答案 1 :(得分:2)

这不是有效的语法,要执行此操作,您需要将数组的内容散布(“解包”)到某种类型的容器(例如数组)中。但是,如果您要执行以下操作:

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)

答案 2 :(得分:2)

如注释中所述,函数只能返回一个值。

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

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

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