js原生数组去重

方式一

使用indexOf检测元素是否已经存在

function uniq(array){
    if(array==null)
        return;

    var ret=[];
    for(var i=0;i<array.length;i++){
        if(ret.indexOf(array[i])===-1)
            ret.push(array[i]);
    }

    return ret;
}

方式二

使用对象存储已经选取的元素,并用于判断剩余元素是否已经选取。

function uniq(array){
    var ret=[],temp={};
    for(var i=0;i<array.length;i++){
        if(!temp[array[i]]){
            temp[array[i]]=true;
            ret.push(array[i]);
        }
    }

    return ret;
}

方式三

使用indexOf与元素的在元素中的下标比较

function uniq(array){
    var ret=[];
    array.forEach(function(item,i,array){
        if(array.indexOf(item)===i)
            ret.push(item);
    });

    return ret;
}

方式四

将数据排序,并且和结果数组的最后的元素作比较去重

function uniq(array){
    var ret=[];
    var lastVal=array[0];
    ret.push(array[0]);
    array.sort();
    for(var i=0;i<array.length;i++){
        if(lastVal!=array[i]){
            lastVal=array[i];
            ret.push(lastVal);
        }
    }
    return ret;
}
### 使用原生 JavaScript 实现数组的多种方法 在处理整型数组问题时,可以采用多种原生 JavaScript 方法。以下总结了几种常见的实现方式,涵盖性能和可读性等方面。 #### 1. 双循环 该方法通过嵌套遍历原始数组和结果数组来判断是否复,最终返回一个不包含复元素的新数组。这种方式的时间复杂度为 O(n²),适用于小规模数据集。 ```javascript function unique(arr) { if (!Array.isArray(arr)) { console.log('type error!'); return; } let res = [arr[0]]; for (let i = 1; i < arr.length; i++) { let flag = true; for (let j = 0; j < res.length; j++) { if (arr[i] === res[j]) { flag = false; break; } } if (flag) { res.push(arr[i]); } } return res; } ``` 此方法较为基础,但效率较低,在处理大规模数组时会占用较多内存[^3]。 #### 2. 利用 `filter()` 和 `indexOf` 借助 `filter()` 方法与 `indexOf` 配合,可以简洁地筛选出唯一值: ```javascript const arr = [1, 2, 2, 3, 4, 4, 5]; const uniqueArr = arr.filter((value, index, self) => self.indexOf(value) === index); console.log(uniqueArr); // [1, 2, 3, 4, 5] ``` 该方法利用了 `indexOf` 查找当前值首次出现的位置,并与当前索引对比以判断是否唯一[^4]。 #### 3. 使用对象辅助存储键值 通过结合对象结构存储已存在的值,可以在查找过程中提升效率: ```javascript function unique(arr) { const seen = {}; return arr.filter(item => { return seen.hasOwnProperty(item) ? false : (seen[item] = true); }); } ``` 这种方法将时间复杂度降低至接近 O(n),适合中等规模的数据集。 #### 4. 使用 `reduce()` 构建唯一数组 通过 `reduce()` 方法逐个检查并添加非复元素到累积数组中: ```javascript function unique(arr) { return arr.reduce((acc, value) => { if (!acc.includes(value)) acc.push(value); return acc; }, []); } ``` 该方法具有良好的可读性,但 `includes` 操作本身是 O(n),整体复杂度仍较高。 #### 5. 结合对象和数组进行 使用对象记录已经存在的元素,避免复插入: ```javascript function unique(arr) { const seen = {}; const result = []; for (let i = 0; i < arr.length; i++) { if (!seen[arr[i]]) { seen[arr[i]] = true; result.push(arr[i]); } } return result; } ``` 这种写法在实际应用中较为常见,兼具性能与易读性。 #### 6. 利用 ES6 的 `Set` 进行(推荐) ES6 提供了 `Set` 数据结构,其特性保证了集合内元素的唯一性,因此可以直接用于数组: ```javascript function unique(arr) { return [...new Set(arr)]; } ``` 该方法简洁高效,且时间复杂度接近 O(n),是现代开发中最常用的手段之一[^1]。 --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值