每天都提供一道关于前端面试中常见的题目。
今日题目:
将二维数组转成一维数组的方法有哪些?
题解:
1.1 flat
ES10的方法,默认将二维数组转成一维数组
[
[1, 3],
[4, 5],
].flat(); // [1,3,4,5]
flat()
可以将任意维数组转成一维数组,只需要传入被扁平化的层数,比如将三维数组转成—维数组就是flat(2)
。如果是未知层数,还可以使用参数Infinity。
1.2 concat + 扩展符
[].concat(
...[
[1, 2],
[3, 4],
]
); // [1,2,3,4]
1.3 reduce + concat
[
[1, 2],
[3, 4],
].reduce((acc, cur) => acc.concat(cur), []); // [1,2,3,4]
1.4 toString + split
先使用toString把数组转成字符串,再使用split把字符串转回数组:
[
[1, 2],
[3, 4],
]
.toString()
.split(",")
.map((item) => +item); // [1,2,3,4]
该方法存在局限性,不适用于一些包含相对特殊子元素的数组,比如包含null、undefined、对象类型等。
1.5 扩展:递归降维
- forEach
const oldArr = [1, [2, [3, [10]]], [4, 5, 6], 7, 8];
const newArr = [];
const flatArr = (arr) =>
arr.forEach((item) => {
if (Array.isArray(item)) {
flatArr(item);
} else {
newArr.push(item);
}
});
flatArr(oldArr);
console.log(newArr); //[1, 2, 3, 10, 4, 5, 6, 7, 8]
- reduce
const oldArr = [1, [2, [3, [10]]], [4, 5, 6], 7, 8];
const flatArr = (arr) =>
arr.reduce((prev, cur, index, arr) => {
if (Array.isArray(cur)) {
return prev.concat(...flatArr(cur));
}
return prev.concat(cur);
}, []);
console.log(flatArr(oldArr)); //[1, 2, 3, 10, 4, 5, 6, 7, 8]
我会帮大家把每一天的题目和超级详细的答案整理好