什么是数组扁平化?
数组扁平化就是将「多维数组」转化为「一维数组」。
这样的方式就是一维数组。
var arr = [1, 2, 3, 4]
多维数组就是数组中包括数组。
var arr = [1, 2, 3, 4, [5, 6, [7, 8]]];
而数组扁平化就是将多维数组转化为一维数组。
var arr = [1, 2, 3, 4, [5, 6, [7, 8]]];// 转化为var arr = [1, 2, 3, 4, 5, 6, 7, 8];
那么看下我今天的主角🥲 ,亮个相吧小宝贝 !
// 编写程序将数组扁平化并将扁平化数组后去重,最终得到一个升序且不重复的一维数组var arr = [[1, 2, 3],[3, 4, 5, 5],[6, 7, 8, 9, [11, 12, [12, 13, [14]]]],10,];
for 循环 + 递归
// 该方法用于判断 item 是不是一个数组function _isArr(item){return {}.toString.call(item) === "[object Array]"}function flatten(arr) {var _arr = arr || [];var newArr = [];for (let i = 0; i < _arr.length; i++) {// 如果是一个数组if(_isArr(_arr[i])){// 那就进行递归,将结果合并到 _arr 中// 例如 newArr = newArr.concat(flatten([1, 2, 3]))newArr = newArr.concat(flatten(_arr[i]))}else{// 如果不是数组那就直接 pushnewArr.push(arr[i])}}return newArr}console.log(flatten(arr));// [1, 2, 3, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12, 13, 14, 10]
或者来个优化版本哈哈哈
Array.prototype.flatten = function () {var _arr = this;var newArr = [];var toStr = {}.toString;// 如果不是数组抛出错误if (toStr.call(_arr) !== "[object Array]") {throw new Error("只有数组才能调用flatten方法");}_arr.forEach((item) => {// 利用三目运算符判断是不是数组toStr.call(item) === "[object Array]"? (newArr = newArr.concat(item.flatten())): newArr.push(item);});return newArr;};console.log(arr.flatten());// [1, 2, 3, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12, 13, 14, 10]
ES6 的 flat()
或者简单方便
console.log(arr.flat()); // [1, 2, 3, 3, 4, 5, 5, 6, 7, 8, 9, Array(3), 10]
但是这样的方式只能扁平化二维数组,三维数组就不好使了
flat()还可以传参Infinity表示无穷的,这样就能快速的实现数组扁平化
console.log(arr.flat(Infinity));// [1, 2, 3, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12, 13, 14, 10]
最后来个完整的答案:
// arr.flat(Infinity) 实现扁平化后用 new Set() 实现去重,// new Set 返回 Set 对象 用 Array.from 转化为数组,// 最后使用 sort 来排序let res = Array.from(new Set(arr.flat(Infinity))).sort(function (a, b) {return a - b;});console.log(res);
