JavaScript数组的去重

数组去重的几种方法

01 在原型里添加方法

在数组原型中添加一个名为unipue的方法,方法中设置一个变量用来存放去重后的数组,一个空对象(数组的索引=对象的key,数组的值=对象的value),循环数组的长度,判断数组中是否有数组的值,如果没有执行以下代码:用push在空数组中添加新值,空对象的value = 当前的值,执行完循环,返回存放数组的变量。

Array.prototype.unipue = function(){ 
    var ret = [] // 用来存放去重后的数组 
    var o = {} // 空对象 
    for(var i=0;i<this.length;i++){ 
        if(!o[this[i]]){ 
            ret.push(this[i]) 
            o[this[i]] = this[i] 
        } 
    } 
    return ret 
} 

var arr = [1,2,3,1,3,3,4,5,6,5,5,7,8,9,10,9,9,9]; 
var unique = arr.unique(); 
console.log(unique); // [1,2,3,4,5,6,7,8,9,10]

02 双重for循环去重

利用双重for循环,第一次循环确保数组中每一项都能被比较,第二层循环确保·被比较项后的每一项·都能被·比较项·比较

var arr = [1,1,2,3,4,5,3,7,8]; 
    function removeDuplicatedItem(arr){ 
        for(var i=0;i<arr.length;i++){ 
            for(var j=i+1;j<arr.length;j++){ 
                // 后面数据若跟前一项数据相同,则重复,需要去除 
                if(arr[i] == arr[j]){ 
                    arr.splice(j,1) // 去除后面的相同项 
                    j-- 
                    /* j--的原因: 
                        每次使用splice删除元素时,返回的是一个新的数组, 
                        这意味着这个数组下次遍历是跳过了一个元素 
                    */ 
                } 
            } 
        } 
        return arr 
    } 
arr2 = removeDuplicatedItem(arr); 
console.log(arr2); // 去重以后的数组

03 单层循环

利用新对象来记录新数组中已经储存过的元素

var arr = [1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5]; 
var o = {} 
var newArr = [] 
for(var i=0;i<arr.length;i++){ 
    var k = arr[i] // 将当前数值赋给key 
    if(!o[k]){ 
        // 如果对象的key没有当前数组值 
        o[k] = true 
        newArr.push(k) // 在新数组中添加 
    } 
} 
console.log(newArr)

04 利用indexOf + splice去重

利用indexOf方法判断当前元素首次出现的位置下标与循环的下标是否相等

var ar = [1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5]; 
function rep2(arr){ 
    for(var i=0;i<arr.length;i++){ 
        if(arr.indexOf(arr[i]) != i){ 
            // 从当前位置索引删除1个元素 
            arr.splice(i,1) 
            // 数组下标减1 
            i-- 
        } 
    } 
    return arr 
} 
var a1 = rep2(ar); 
console.log(a1);

05 indexOf + push

var arr = [1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5]; 
function rep(arr) { 
    var ret = [];//空数组[存放新值/不重复] 
    for(var i = 0; i < arr.length; i++){ 
        //若当前数值首次出现的下标 = 循环的下标 
        if(arr.indexOf(arr[i]) == i) { 
            // 则在新数组中添加当前数值 
            ret.push(arr[i]); 
        } 
    } 
    return ret; 
} 
arr2 = rep(arr); 
console.log(arr2);

06 filter + indexOf

var arr = ['apple', 'strawberry', 'banana', 'pear', 'apple', 'orange', 'orange', 'strawberry']; 
var r = arr.filter(function(element, index, self) {//element 元素 index:索引 self 数组 
// 查找当前元素在数组中首次出现的索引 == 当前索引值,说明是第一次出现 
return self.indexOf(element) === index; }); 
console.log(r);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值