您好,欢迎来到化拓教育网。
搜索
您的当前位置:首页JavaScript数组去重的方法总结(附代码)

JavaScript数组去重的方法总结(附代码)

来源:化拓教育网


filter 的回调有三个参数,其中第三个参数是当前元素属于的数组对象,这样我们可以继续利用 indexOf 属性啦。

function unique(origin) {
 var result = origin.filter(function (item, index, array){
 // 获取元素在源数组的位置,只返回那些索引等于当前元素索引的值。
 return array.indexOf(item) === index;
 });
 return result;
}

filter 兼容到 IE9, 这种方法没有 for 循环,主要利用了 filter 和 indexOf 属性,所以代码相对比较优雅。

四、利用 Object 的 key value

function unique(origin) {
 var result = [];
 var hashTable = {};
 for(var i = 0; i< origin.length; i++) {
 // 如果键对应的值,为真,意味着对象的键中已经有重复的键了。
 if(!hashTable[origin[i]]) {
 // 将元素作为对象的键,默认键对应的值为 true, 
 hashTable[origin[i]] = true;
 
 // 如果对象中没有这个键,则将这个元素放入结果数组中去。
 result.push(origin[i]);
 }
 }
 return result;
}

这种方案的事件复杂度为 O(n), 但是对象的键,默认是字符串类型,这意味着什么呢,数字 1 和 字符串 '1',在键中是相等的,所以,上面这种方法不适合字符串和数字混合的去重。

所以我们将元素的类型也放入对象的键中:

function unique(origin) {
 var result = [];
 var hashTable = {};
 for(var i = 0; i< origin.length; i++) {
 var current = origin[i];
 // 字符串拼接元素的类型和元素
 var key = typeof(current) + current;
 if(!hashTable[key]) {
 hashTable[key] = true;
 result.push(current);
 }
 }
 return result;
}

五、数组的 sort 方法

function unique(origin) {
 return origin.concat.sort().filter(function(item, index, array) {
 // !index 表示第 0 个元素应该被返回。
 return !index || item !== origin[index-1]
 })
}

function unique(array) {
 array.sort(); // 排序字符串
 array.sort(function(a, b) {
 return a-b; // 排序数字
 })
 
 for(let i=0; i<array.length; i++) {
 if(array[i] === array[i+1]) {
 array.splice(i, 1);
 i--; // 应该将前一个数删除,而不是删除后一个数。是因为元素被删除之后,后面元素的索引会迁移,所以要 i--;
 }
 }
 return array;
}

sort 方法的优点在于利用了排序,返回后一个和前一个不相等的元素。比较简洁和直观。缺点在于改变了元素的本来的排序位置。

六、ES6 Set

ES6 提供了新的数据结构 Set,它类似于数组,但是成员的值都是唯一的,没有重复的值。向 Set 加入值的时候,不会发生类型转变,所以 5 和 '5' 是两个不同的值。Set内部判断两个值是否相同,用的是类似于 "==="的算法,但是区别是,在set内部认为NaN 等于 NaN ;

Set 可以转换为数组,所以很容易实现去重

function unique(origin) {
 return Array.from(new Set(origin));
}

七、ES6 Map

ES6 新增了 Map 数据结果,通过 has 和 set 方法就能很方便的对前面的 object key value 方案进行优化。

function unique(origin){
 const map = new Map()
 return origin.filter((item) => !map.has(item) && map.set(item, true))
}

八、类型判断

一些常见的数据类型是 ===indexOf 是无法检测的,举个例子:

console.log({} === {}) // false;

console.log(NaN === NaN) // false;

console.log(/a/ === /a/); // false;

console.log(1 === new String('1')) // false;

var arr = [NaN];
console.log(arr.indexOf(NaN)); // -1

所以在判断的时候,如果数据里有 NaN 和对象时要避免使用 indexOf===;

前面 Set 那里说过了,所以 Set 方法是可以去重 NaN的。

总结

数据去重在网上已经看烦了,但还是想专门写一篇文章来实践和总结,能在工作中多几个思路也是极好的。感谢那些热爱分享和喜欢输出的人。

Copyright © 2019- huatuo9.cn 版权所有 赣ICP备2023008801号-1

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务