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



这是我尝试的:

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

我尝试使用明确的return语句和周围值,但没有括号,但没有任何作用...

我只是想知道是否有一种简单的方法可以返回"传播的数组"?

编辑:现在我已经看到了这个问题,它在传播操作员的工作原理方面具有准确性p>

这不是有效的语法,要为此,您需要将数组的数组分布在某种类型的容器中(例如数组)。但是,如果您要做类似:

的事情
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)

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

如注释中所写,函数只能返回一个 value。

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

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

最新更新