Set目标开展数组去重简单实用

lxf2023-04-19 17:58:01

序言

二维数组算得上是常与大家接触的'老友'了,对于各位而言针对数组去重应当很了解了,今日那就让我们来讲讲常见的几类数组去重的办法

去重复方式

简易快速地es6的Set

es6所提供的Set目标开展数组去重简单实用,且代码开发简约最易读,仅需二维数组转换成Set目标再转化回家就能够完成一次去重复,但是使用Set目标去重复的速度比其他方式高,由于Set目标值贮存唯一的值,还可以在添加元素时实现快速较为。 如下列案例

let arr = [1, 2, 2, 3, 5, 6, 6]
// Set 去重复
function uniq(arr) {
    return Array.from(new Set(arr))
}

console.log(arr);
console.log(uniq(arr));
Set目标开展数组去重简单实用 能够看见特别简单的就实现了数组去重,可是此方法有一个缺点,它难以实现对象类型二维数组的去重复。如下所示:
let arr = [1, 2, 2, 3, 5, 6, 6, {a: 1}, {a: 1}]
// Set 去重复
function uniq(arr) {
    return Array.from(new Set(arr))
}

console.log(arr);
console.log(uniq(arr));
Set目标开展数组去重简单实用

能够看见二维数组中引用类型的信息并没开展去重复,主要是因为Set的去重复参考是指(===),二维数组里的原素目标,虽然标值相同,可是详细地址不相同。因此Set难以实现去重复。

总的来说,应用 Set 方式去重复是一种简易、高效率、易成功的方法,适用绝大部分的数组去重要求。那如果需要重二维数组其中包含目标原素,就需要用其他方式进行去重复。

最原始的双层循环系统

选用双层循环系统能够对一切种类二维数组开展去重复,且代码逻辑简易,如下所示:

let arr = [1, 2, 2, 3, 5, 6, 6, {a: 1}, {a: 1}]
// 2次循环系统
function uniq(arr) {
    for (let i = 0, len = arr.length; i < len; i  ) {
        for (let j = i   1, len = arr.length; j < len; j  ) {
            if (arr[i] === arr[j]) {
                arr.splice(j, 1)
                j--
                len--
            }
        }
    }
    return arr
}

console.log(arr);
console.log(uniq(arr));
Set目标开展数组去重简单实用 可能有人会问,这目标数据信息并不是没有开展去重吗?别着急我们继续往下看:
let arr = [{id: 1, a: 1}, {id: 1, a: 1}]
// 2次循环系统
function uniq(arr) {
    for (let i = 0, len = arr.length; i < len; i  ) {
        for (let j = i   1, len = arr.length; j < len; j  ) {
            if (arr[i].id === arr[j].id) {
                arr.splice(j, 1)
                j--
                len--
            }
        }
    }
    return arr
}

console.log(arr);
console.log(uniq(arr));
Set目标开展数组去重简单实用 能够看见针对对象类型的二维数组可以根据目标数据信息里的某一原素做为去重复根据开展去重复,不过在这里仅仅一个简单的举例说明,实际操作中自己能依据实际需求自由选择与对编码作出调整。

总的来说,双向循环系统遍历数组的形式尽管代码逻辑简易,可是代码逻辑简易效率不高,适用中小型二维数组或者是对特性要求较低的画面,但是对于大中型二维数组或者是对特性要求高的情景。

indexOf去重复

indexOf开展数组去重非常简单(针对上一个方式),适用简易基本数据类型二维数组,不适宜对象类型二维数组。如下所示:

let arr = [1, 2, 6, 2, 3, 4, 1]
function uniq(arr) {
    let newArr = []
    for (let i = 0; i < arr.length; i  ) {
        if (newArr.indexOf(arr[i]) === -1) {
            newArr.push(arr[i])
        }
    }
    return newArr
}

console.log(arr);
console.log(uniq(arr));
Set目标开展数组去重简单实用 能够看见针对简易基本数据类型的成功去重复。

尽管应用 indexOf方式去重复相对性简单实用,但只是针对简易基本数据类型的二维数组,针对复杂数据类型的二维数组不建议用,并且高效率比较低。

includes去重复

这和indexOf方式相近,仅需对于该编码稍微改动。如下所示:

let arr = [1, 2, 6, 2, 3, 4, 1]
function uniq(arr) {
    let newArr = []
    for (let i = 0; i < arr.length; i  ) {
        if (!newArr.includes(arr[i])) {
            newArr.push(arr[i])
        }
    }
    return newArr
}
console.log(arr);
console.log(uniq(arr));
Set目标开展数组去重简单实用

能够看见都是完成了对二维数组的去重复,但是与其他方式一样不建议。

filter数组去重

function uniq(arr) {
    return arr.filter(function (item, index) {
        return arr.indexOf(item, 0) === index
    })
}
console.log(arr);
console.log(uniq(arr));

filter根据自定使用的标准来判定现阶段原素是不是符合条件,达到则留有,不然pass。本例是由分辨现阶段原素字符在这个原素在arr中第一次出现字符是不是同样,是则保存,这其中的判断语句, arr 提出要搜索的二维数组,item提出要搜索元素,0 表明从字符串的 0这一索引值开始查找,该主要参数能够给其他,初始值为 0。

Set目标开展数组去重简单实用

结束语

以上就是,此次分享五种数组去重方式,自然数组去重的办法各种各样,也有map、reduce一些等,这儿也就不再一一阐述了,有兴趣的话能够自己去找类似文章看一看,好啦本文到这里就没有了,Bye!!!