js扁平化数组

es6的flat方法

  • 数组的成员有时还是数组,Array.prototype.flat()用于将嵌套的数组“拉平”,变成一维的数组。该方法返回一个新数组,对原数据没有影响。
[1, 2, [3, 4]].flat()
// [1, 2, 3, 4]

  • 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]

扩展

  • 已知如下数组:

var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];

编写一个程序将数组扁平化去并除其中重复部分数据,最终得到一个升序且不重复的数组

Array.from(new Set(arr.flat(Infinity))).sort((a,b)=>{ return a-b})

toString方法(数组元素为数字)

function flatten(arr){
    return arr.toString().split(',').map(function(item){
         return parseInt(item);
     })
}    

flatten(arr)   // [1,2,3,4]

递归


var arr = [1, 2, [3, [4, 5]]];
 
function flatten(arr) {
	var res = [];
	for(var i = 0; i < arr.length; i++) {
		if(Array.isArray(arr[i])) {
			res = res.concat(flatten(arr[i]));
		} else {
			res.push(arr[i]);
		}
	}
	return res;
}
 
var result = flatten(arr);

reduce


var arr = [1, 2, [3, [4, 5]]];
 
function flatten(arr) {
	return arr.reduce((result, item) => {
		return result.concat(Array.isArray(item) ? flatten(item) : item);
	}, []);
}
 
var result = flatten(arr);
console.log(result);

join & split

var arr = [1, 2, [3, [4, 5]]];
 
function flatten(arr) {
	return arr.join(',').split(',').map(function(item) {
		return parseInt(item);
	})
}
 
var result = flatten(arr);
console.log(result);

扩展运算符

var arr = [1, 2, [3, [4, 5]]];
 
function flatten(arr) {
	while(arr.some(item => Array.isArray(item))) {
		arr = [].concat(...arr);
	}
	return arr;
}
 
var result = flatten(arr);
console.log(result);
comments powered by Disqus