我是靠谱客的博主 过时乌龟,最近开发中收集的这篇文章主要介绍【ECMAScript 内置对象之Array】数组去重(11种方法),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

    • 数组去重
      • 方法一: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的区别)

  1. indexOf是找一个元素在数组中的下标,不存在返回-1
  2. includes是判断一个元素是否在数组中,返回bool值
  3. 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种方法)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(32)

评论列表共有 0 条评论

立即
投稿
返回
顶部