**使用递归**
var arr = [[1],[[2,3],4],[5,6,7]]
var newArr= [];
function unid(arr) {
for(var i=0;i<arr.length;i++){
console.log(newArr[i])
if(Array.isArray(arr[i])){
return unid (arr[i]);
}else{
newArr.push(arr[i])
}
}
}
unid (arr);
console.log(newArr);//[1,2,3,4,5,6,7]
使用map
var arr = [[1],[[2,3],4],[5,6,7]]
function unid(arr) {
var arr1=(arr + '').split(',');//数组转化为字符串,以逗号分割
var arr2 = arr1.map(function (x) {
return Number(x);
});
return arr2;
}
console.log(unid(arr));//[1,2,3,4,5,6,7]
使用flat
flat()、flatMap()为es6新增加的方法,该方法返回一个新数组,对原数据没有影响。
flat()默认只会“拉平”一层,如果想要“拉平”多层的嵌套数组,可以将flat()方法的参数写成一个整数,表示想要拉平的层数,默认为1。
[1, 2, [3, [4, 5]]].flat()
// [1, 2, 3, [4, 5]]
[1, 2, [3, [4, 5]]].flat(2)
// [1, 2, 3, 4, 5]
如果不管有多少层嵌套,都要转成一维数组,可以用Infinity关键字作为参数。
[1, [2, [3]]].flat(Infinity)
// [1, 2, 3]
flatMap()方法对原数组的每个成员执行一个函数(相当于执行Array.prototype.map()),然后对返回值组成的数组执行flat()方法。该方法返回一个新数组,不改变原数组。
flatMap()只能展开一层数组。
// 相当于 [[2, 4], [3, 6], [4, 8]].flat()
[2, 3, 4].flatMap((x) => [x, x * 2])
// [2, 4, 3, 6, 4, 8]
// 相当于 [[[2]], [[4]], [[6]], [[8]]].flat()
[1, 2, 3, 4].flatMap(x => [[x * 2]])
// [[2], [4], [6], [8]]
依然返回嵌套数组