为什么我们不能在 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]
这是我尝试过的:
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" ?
编辑:现在我已经看到
尝试使用 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]