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准确)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值