方法一:普通的递归
const arr = [1, [2, [3, [4, 5]]]];
const flatten = (arr) => {
let result = [];
for (let i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) {
result = result.concat(flatten(arr[i]));
} else {
result.push(arr[i]);
}
}
return result;
};
console.log(flatten(arr)); // [0, 1, 2, 3, 4, 5]
方法二:利用 reduce 函数迭代
// 利用 es5 的 arr.reduce(callback[, initialValue]) 实现
let arr = [[0, 1], [2, 3], [4, [5, 6, 7]]]
const flatten = (arr) => {
return arr.reduce((pre, cur) => {
return pre.concat(Array.isArray(cur) ? flatten(cur) : cur)
}, []);
};
console.log(flatten(arr)); // [0, 1, 2, 3, 4, 5, 6, 7]
// 指定维数进行扁平
const arr = [1, 2, 3, 4, [5, 6, 7, [8, 9, 10, [11, 12, 13]]], 14, 'string', { name: '张铁蛋同学' }];
const flatten = (arr, num = 1) => {
return arr.reduce((pre, cur) => {
return pre.concat(Array.isArray(cur) ? flatten(cur, num - 1) : cur);
}, []);
};
console.log(flatten(arr, 2)); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, Array(3), 14, 'string', {…}]
方法三:利用扩展运算符和 map
let arr = [[1, 2], 3, [[[4], 5]]]
const flatten = (arr) => {
return [].concat(...arr.map(x => Array.isArray(x) ? flatten(x) : x))
}
console.log(flatten(arr)) // [1, 2, 3, 4, 5]
方法四:利用 while 和 some 和 扩展运算符
let arr = [[1, 2], 3, [[[4], 5]]]
const flatten = (arr) => {
while(arr.some(item => Array.isArray(item))){
arr = [].concat(...arr);
}
return arr;
};
console.log(flatten(arr)); // [1, 2, 3, 4, 5]
方法五:split 和 toString 共同处理,但结果会变成字符串
let arr = [[1, 2], 3, [[[4], 5]]]
const flatten = (arr) => {
return arr.toString().split(',')
};
console.log(flatten(arr)); // ['1', '2', '3', '4', '5']
方法六:利用 ES 的最新语法,Array.prototype.flat(),缺点是有兼容性问题,优点是非常简单
flat() 方法会递归到指定深度将所有子数组连接,并返回一个新数组。
语法:`let newArray = arr.flat(depth)`,参数说明:depth,可选,指定嵌套数组中的结构深度,默认值为1。
const arr = [1, [2, [3, [4, 5]]]];
const flatten = (arr) => {
return arr.flat(Infinity)
};
console.log(flatten(arr)); // [1, 2, 3, 4, 5]
特殊说明:flat()方法会移除数组中的空项,但 undefined、null 仍会保留
let arr = [1, 2, , undefined, 4, 5, null];
arr.flat(); // [1, 2, undefined , 4, 5, null]
二维转一维
第一种
let arr = [[0, 1], [2, 3], [4, 5]];
let arr1 = [].concat.apply([], arr);
console.log(arr1) // [0, 1, 2, 3, 4, 5]
第二种
let arr = [[0, 1], [2, 3], [4, 5]];
let arr1 = arr.reduce((a, b) => a.concat(b));
console.log(arr1) // [0, 1, 2, 3, 4, 5]
网友评论