現(xiàn)在有一個(gè)需求: 多維數(shù)組=>一維數(shù)組锌雀;
var arr = [1,2,[3,4,[5,6,[7,8]]],[9,10], [11,12,[13,14]]]
var str = JSON.stringify(arr);
期望最后得到 [1,2,3,4,5,6,7,8,9,10,11,12,13,14]
方法一 flat
Array.prototype.flat()用于將嵌套的數(shù)組“拉平”堰燎,變成一維數(shù)組派诬。該方法返回一個(gè)新數(shù)組氛雪,對(duì)原數(shù)據(jù)沒有影響几莽。
[1, 2, [3, [4, 5]]].flat()
// [1, 2, 3, [4, 5]]
[1, 2, [3, [4, 5]]].flat(2)
// [1, 2, 3, 4, 5]
如果不管有多少層嵌套腾仅,都要轉(zhuǎn)成一維數(shù)組力惯,可以用Infinity關(guān)鍵字作為參數(shù)。
var arr = [1, 2, [3, 4, [5, 6, [7, 8]]], [9, 10], [11, 12, [13, 14]]]
var a = arr.flat(Infinity) // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
其中還有一個(gè) flatMap()方法對(duì)原數(shù)組的每個(gè)成員執(zhí)行一個(gè)函數(shù)死讹,相當(dāng)于執(zhí)行Array.prototype.map(),然后對(duì)返回值組成的數(shù)組執(zhí)行flat()方法瞒滴。該方法返回一個(gè)新數(shù)組,不改變原數(shù)組赞警。
// 相當(dāng)于 [[2, 4], [3, 6], [4, 8]].flat()
[2, 3, 4].flatMap((x) => [x, x * 2])
// [2, 4, 3, 6, 4, 8]
方法二 replace + split
arr = str.replace(/(\[|\])/g, '').split(',')
方法三 replace + JSON.parse
str = str.replace(/(\[|\])/g, '');
str = '[' + str + ']';
arr = JSON.parse(str);
方法四 普通遞歸
var arr = [1, 2, [3, 4, [5, 6, [7, 8]]], [9, 10], [11, 12, [13, 14]]]
var result = [];
var fn = function (arr) {
for (let i = 0; i < arr.length; i++) {
let item = arr[i];
if (Array.isArray(item)) {
fn(item);
} else {
result.push(item);
}
}
return result
}
console.log(fn(arr))
方法五 利用reduce函數(shù)迭代
var arr = [1, 2, [3, 4, [5, 6, [7, 8]]], [9, 10], [11, 12, [13, 14]]]
function flatten(arr) {
return arr.reduce((pre, cur) => {
return pre.concat(Array.isArray(cur) ? flatten(cur) : cur);
}, []);
}
console.log(flatten(arr))
方法六 擴(kuò)展運(yùn)算符
var arr = [1, 2, [3, 4, [5, 6, [7, 8]]], [9, 10], [11, 12, [13, 14]]]
// some 遇到true停止妓忍,在里面改變arr,然后繼續(xù)while循環(huán)
while (arr.some(Array.isArray)) {
arr = [].concat(...arr);
}
console.log(arr)
參考:
https://blog.csdn.net/qq_29055201/article/details/86530254