JavaScript专题之数组扁平化 - Go语言中文社区

JavaScript专题之数组扁平化


题目:

编写一个程序, 将数组扁平化, 并去除其中重复部分数据,最终得到一个升序且不重复的数组 let arr = [[1, 2, 2], [3, 4, 5, 5],[6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10]

// 方式一:使用ES6提供的Array.prototype.flat处理
//扁平化后去重再排序
//arr.flat(Infinity),使用 Infinity,可展开任意深度的嵌套数组

//去重两种方式,因为new Set(arr)的结果是对象,需要转换为数组
// [...new Set(arr)] 
// Array.from(new Set(arr)) 
function flatten1(arr) {
    return Array.from(new Set(arr.flat(Infinity))).sort((a, b) => a - b)
}
console.log(flatten1(arr))

// 方式二:
//把数组直接变为字符串即可,数组toString之后,不管有多少级.最后都会变为以逗号分隔的字符串
//没有中括号和所谓的层级,相当于直接扁平化了
function flatten2(arr) {
    return arr.toString().split(',').map(item => Number(item))
}
console.log(flatten2(arr))
// 也可以用join
//arr.join('|'): 1,2,2|3,4,5,5|6,7,8,9,11,12,12,13,14|10
function flatten21(arr) {
    return arr.join('|').split(/(?:, |  |)/g).map(item => Number(item))  //正则表达式:,或者| 即, | |,而|需要转义,也就是, |  |
}
console.log(flatten21(arr))


// 方式三:
//JSON.stringify(arr):[[1,2,2],[3,4,5,5],[6,7,8,9,[11,12,[12,13,[14]]]],10]
function flatten3(arr) {
    return JSON.stringify(arr).replace(/([|])/g,'').split(',').map(item => Number(item))
}
console.log(flatten3(arr))

//方式四
// 基于数组的some方法进行判断检测,验证数组中的某一项有没有符合函数中提供的规则的
//Array.isArray([val]):检测某个值是否为数组类型(比instanceof Array准确)
function flatten4(arr) {
    while(arr.some(item => Array.isArray(item))) {
        arr = [].concat(...arr)  //每次展开一层级的数组
    }
    return arr
}
console.log(flatten4(arr))

// 方式五: 递归
function flatten5(arr) {
    var result = [];
    for (var i = 0, len = arr.length; i < len; i++) {
        if (Array.isArray(arr[i])) {
            result = result.concat(flatten5(arr[i]))
        }
        else {
            result.push(arr[i]) //push()
        }
    }
    return result;
}
console.log(flatten5(arr))

上面所用到方式详解:
1.把数组直接变为字符串
toString:
在这里插入图片描述
join:
在这里插入图片描述

2.JSON.stringify:将对象a变成了字符串c,那么我就可以用JSON.parse()将字符串c还原成对象a
在这里插入图片描述
3.
Array.some()

var A = [1, 2, 3, 4, 5];
var B = A.some(item => {
return item > 6
})
console.log(B) //false

Array.find()

var A = [1, 2, 3, 4, 5];
var B = A.find(item => {
return item < 6
})
console.log(B) //1

结论:
find和some的区别: some返回的是boolean,find找到符合规则的,返回当前这一项,没找到符合的,返回undefined

4.使用instanceof 和 Array.isArray([val]) 判断是不是数组

function fn() {

}
let f = new fn()
f.__proto__ = Array.prototype
console.log(f instanceof Array) //true
console.log(Array.isArray(f)) //false

结论:Array.isArray([val]):检测某个值是否为数组类型(比instanceof Array准确)

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_20464593/article/details/106170868
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-04-12 01:31:17
  • 阅读 ( 569 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢