概述
文章目录
- 数组去重
- 方法一:for循环
- 算法1
- 算法2
- 方法二:filter
- 方法三:forEach
- 算法1(配合indexOf)
- 算法2(配合includes)
- 总结(indexOf跟includes的区别)
- 方法四:sort
- 算法1
- 算法2
- 算法3(sort加reduce)
- 方法5(使用Map)
- 算法1(Map)
- 算法2(Object)
- 方法6(使用Set)最简单、最推荐的一种
数组去重
方法一:for循环
注意:去重不了 NaN
算法1
var arr = [
1,1,22,3,4,3,null, null,undefined,undefined,NaN,NaN
];
function unique(arr) {
var _arr = [],
isRepeat; // 唯一标识
for(var i = 0; i < arr.length; i ++) {
isRepeat = false;
for(var j = 0; j < _arr.length; j ++) {
if(_arr[j] == arr[i]) {
isRepeat = true;
break;
}
}
if(!isRepeat) {
_arr.push(arr[i]);
}
}
return _arr;
}
console.log(unique(arr));
算法2
var arr = [
1,1,22,3,4,3,null, null,undefined,undefined,NaN,NaN
];
function unique(arr) {
var _arr = [],
isRepeat; // 唯一标识
for(var i = 0; i < arr.length; i ++) {
isRepeat = false;
for(var j = i + 1; j < arr.length; j ++) {
if(arr[j] == arr[i]) {
isRepeat = true;
break;
}
}
if(!isRepeat) {
_arr.push(arr[i]);
}
}
return _arr;
}
console.log(unique(arr));
算法1 相对于 算法2 快。(对,你没看错~)
方法二:filter
注意:去重不掉 NaN
function unique(arr) {
return arr.filter((item, index) => {
return arr.indexOf(item) === index;
})
}
方法三:forEach
算法1(配合indexOf)
注意:去重不掉 NaN
function unique(arr) {
var _arr = [];
arr.forEach(item => {
if(_arr.indexOf(item) === -1) {
_arr.push(item);
}
})
return _arr;
}
算法2(配合includes)
注意:可以去重 NaN
function unique(arr) {
var _arr = [];
arr.forEach(item => {
if(!_arr.includes(item)) {
_arr.push(item);
}
})
return _arr;
}
总结(indexOf跟includes的区别)
- indexOf是找一个元素在数组中的下标,不存在返回-1
- includes是判断一个元素是否在数组中,返回bool值
- indexOf对NaN无效,但是includes对NaN有效
方法四:sort
算法1
注意:去重不了NaN 跟 undefined
function unique(arr) {
var _arr = [];
arr.sort(); // sort方法会改变原数组
for(var i = 0; i < arr.length; i ++) {
if(arr[i] !== arr[i + 1]) {
_arr.push(arr[i]);
}
}
return _arr;
}
算法2
注意:去重不了NaN
function unique(arr) {
var _arr = [];
arr.sort(); // sort方法会改变原数组
console.log(arr);
for(var i = 0; i < arr.length; i ++) {
if(arr[i] !== _arr[_arr.length - 1]) { // 只有这不一样
_arr.push(arr[i]);
}
}
return _arr;
}
算法3(sort加reduce)
注意:去重不了 NaN
function unique(arr) {
var _arr = [];
return arr.sort().reduce((prev, item) => {
if(prev.length === 0 || prev[prev.length - 1] !== item) {
prev.push(item);
}
return prev;
}, [])
}
方法5(使用Map)
算法1(Map)
注意:可以去重NaN
function unique(arr) {
var _arr = [],
_temp = new Map();
for(var i = 0; i < arr.length; i ++) {
if(!_temp.get(arr[i])) {
_temp.set(arr[i], 1); // 设置键值,值可以随便设置,因为我们只用到键
_arr.push(arr[i]);
}
}
return _arr;
}
算法2(Object)
注意:可以去重NaN
function unique(arr) {
var _arr = [],
_temp = new Object();
for(var i = 0; i < arr.length; i ++) {
if(!_temp[arr[i]]) {
_temp[arr[i]] = 1; // 设置键值,值可以随便设置,因为我们只用到键
_arr.push(arr[i]);
}
}
return _arr;
}
方法6(使用Set)最简单、最推荐的一种
注意:可以去重 NaN
function unique(arr) {
// 利用了Set唯一值的特性 from将类数组转换为数组
return Array.from(new Set(arr));
}
最后
以上就是过时乌龟为你收集整理的【ECMAScript 内置对象之Array】数组去重(11种方法)的全部内容,希望文章能够帮你解决【ECMAScript 内置对象之Array】数组去重(11种方法)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复