madfour / blog-docs

一个备忘录罢了
https://madfour.cn
MIT License
5 stars 0 forks source link

将一个数组([1, [2, 3, [4, 5]]])“扁平化”,并“去重”“排序”。 #3

Open madfour opened 3 years ago

madfour commented 3 years ago

数组扁平化

数组扁平化是指:将一个多维数组变为一堆数组

[1, [2, 3, [4, 5]]] ------> [1, 2, 3, 4, 5]

有如下数组:var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];

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

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

// 扁平化(递归函数)
function flatten(arr){
    let res = []
    arr.map( item => {      // 递归的遍历每一项,若为数组则继续遍历,否则concat
        if(Array.isArray(item)){
            res = res.concat(flatten(item))
        }else{
            res.push(item)
        }
    })
    return res
}
let flatArr = flatten(arr)

// 去重
let disArr = Array.from(new Set(flatArr))

// 排序
let result = disArr.sort((a, b) => {
  return a - b    // 升序; 降序:b-a
})

console.log(result)
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]

上面的代码 等同于 下面:

// 扁平化
Array.prototype.flatten = function(){
  return [].concat(...this.map(item => (Array.isArray(item) ? item.flatten() : [item])));
}

// 去重
Array.prototype.unique = function(){
  return [...new Set(this)]
}

// 排序的顺序(a-b是升序)
const sort = (a, b) => a - b;

console.log('1', arr.flatten().unique().sort(sort))
madfour commented 3 years ago

扩展:扁平化的其它方法

1、使用flat()。前提是必须确定数组是几维的

arr_flat = arr.flat(Infinity);        // 如上题中是4维的,那么:let flatArr = arr.flat(4)

2、使用扩展运算符

function flatten(arr) {
    while(arr.some(item=>Array.isArray(item))) {
        arr = [].concat(...arr);
    }
    return arr;
}

3、使用reduce

function flatten(arr){
    return arr.reduce((result, item) => {
        return result.concat(Array.isArray(item) ? flatten(item) : item)
    }, [])
}

4、replace && parse

let str = JSON.stringify(arr);
let flatArr = JSON.parse('[' + str.replace(/(\[|\])/g, '') + ']')

不推荐 5、(join || toString) & split

// join
function flatten2(arr) {
    return arr.join(',').split(',').map(function(item) {
        return parseInt(item);  // 直接return item;则会得到类似这种["", "", ""]
    })
}
// [1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12, 13, 14, 10]

// toString
function flatten(arr) {
    return arr.toString().split(',').map(function(item) {
        return Number(item);  // 直接return item;则会得到类似这种["", "", ""]
    })
} 
// [1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12, 13, 14, 10]