多维数组降维算是面试里面一个高频题,这里简单总结了几个方法以供参考
一、数组字符串化
let arr = [[222, 333, 444], [55, 66, 77]]
arr += ''
arr = arr.split(',')
console.log(arr) // ["222", "333", "444", "55", "66", "77"]
二、递归
function reduceDimension (arr) {
const ret = []
const toArr = function (arr) {
arr.forEach(function (item) {
item instanceof Array ? toArr(item) : ret.push(item)
})
}
toArr(arr)
return ret
}
三、Array.prototype.flat()
const arr1 = [1, 2, [3, 4]]
arr1.flat()
// [1, 2, 3, 4]
const arr2 = [1, 2, [3, 4, [5, 6]]]
arr2.flat()
// [1, 2, 3, 4, [5, 6]]
const arr3 = [1, 2, [3, 4, [5, 6]]]
arr3.flat(2)
// [1, 2, 3, 4, 5, 6]
// 使用 Infinity 作为深度,展开任意深度的嵌套数组
arr3.flat(Infinity)
// [1, 2, 3, 4, 5, 6]
四、使用 stack 无限反嵌套多层嵌套数组
const arr1 = [1, 2, 3, [1, 2, 3, 4, [2, 3, 4]]]
function flatten (input) {
const stack = [...input]
const res = []
while (stack.length) {
// 使用 pop 从 stack 中取出并移除值
const next = stack.pop()
if (Array.isArray(next)) {
// 使用 push 送回内层数组中的元素,不会改动原始输入 original input
stack.push(...next)
} else {
res.push(next)
}
}
// 使用 reverse 恢复原数组的顺序
return res.reverse()
}
flatten(arr1) // [1, 2, 3, 1, 2, 3, 4, 2, 3, 4]
五、使用 reduce、concat 和递归无限反嵌套多层嵌套的数组
const arr1 = [1, 2, 3, [1, 2, 3, 4, [2, 3, 4]]]
function flattenDeep (arr1) {
return arr1.reduce(
(acc, val) =>
Array.isArray(val) ? acc.concat(flattenDeep(val)) : acc.concat(val),
[]
)
}
flattenDeep(arr1)
// [1, 2, 3, 1, 2, 3, 4, 2, 3, 4]