什么是数组扁平化?
数组扁平化就是将「多维数组」转化为「一维数组」。
这样的方式就是一维数组。
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{
// 如果不是数组那就直接 push
newArr.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);