了解es6的flat和Set

数组去重我们一般大脑最先想到的就是遍历操作,es6可以通过Set进行去重,但是new Set的原型是Set,不是Array,必然需要进行转换;转换的方式很多,比如:
1、Array.from()
2、拓展运算符…
针对多维数组我们转成一位数组并去重,es6的Array.prototype.flat,其实际原理使用了递归操作。创建一个新数组,其中所有子数组元素都以递归方式连接到该数组中,直到达到指定的深度。

	// 手写一个
	function flatten (arr) {
		const flattend = []
		arr.forEach(v => {
			if (Array.isArray(v))
				flattend.push(...flatten(v))
			else flattend.push(v)
		})
		return flattend
	}
	// example
	const arr = [1,  [2, 3], [2], [1, [2]]]
	console.log(flatten(arr))
	// [1, 2, 3, 2, 1, 2]
	console.log([...new Set(flatten(arr))])
	// [1, 2, 3]
	console.log([...new Set(arr.flat())])
	// [1, 2, 3, [2]]
	console.log([...new Set(arr.flat(Infinity))])
	// [1, 2, 3]
	
	// 迭代
	function flatten(arr) {
	  while (arr.some(item => Array.isArray(item))) {
	    arr = [].concat(...arr)
	  }
	  return arr
	}

面试题目:已知如下数组:

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

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

// es6写法
var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];
[...new Set(arr.flat(Infinity).sort((a, b) => a-b))]
// es5
Array.prototype.flat = function () {
	return [].concat(...this.map(v => (v instanceof Array) ? v.flat(v) : [v]))
}
Array.prototype.set = function() {
	const stack = []
	this.forEach(v => stack.indexOf(v) < 0 && stack.push(v))
	return stack
}
arr.flat().set().sort((a, b) => a - b)

你可能感兴趣的:(了解es6的flat和Set)