ECMAScript-数组去重的几种方式

117 阅读1分钟

数组去重

const readyArr = [1, 1, 2, 2, 3, 3, 5, 3, 7, 0, 4, 41, 45, 44, 3];

1. for 循环

1.1 借助中间数组循环

function uniqueArr(arr) {
	let _arr = [],
		isRepeat;

	for (let i = 0; i < arr.length; i++) {
		isRepeat = false; // 和中间数组比较

		for (let j = 0; j < _arr.length; j++) {
			if (_arr[j] == arr[i]) {
				isRepeat = true;
				break;
			}
		}

		if (!isRepeat) {
			_arr.push(arr[i]);
		}
	}

	return _arr;
}

console.log(
	uniqueArr(readyArr).sort(function (a, b) {
		return a - b;
	})
);

1.2 对比本身进行排序(比较慢,时间复杂度高)

function uniqueArr(arr) {
	let _arr = [],
		isRepeat;

	for (let i = 0; i < arr.length; i++) {
		isRepeat = false; // 和自身比较 (方法比较慢)
		for (let 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(
	uniqueArr(readyArr).sort(function (a, b) {
		return a - b;
	})
);

2.filter

function uniqueFilter(arr) {
	return arr.filter(function (item, index) {
		// indexOf只会取符合条件的第一项
		return arr.indexOf(item) === index;
	});
}

3.forEach

function uniqueForEach(arr) {
	var _arr = [];
	arr.forEach(function (item) {
		if (_arr.indexOf(item === -1)) {
			_arr.push(item);
		}
	});
	return _arr;
}

4.sort

4.1 sort

// sort 返回新数组
function uniqueSort(arr) {
	var _arr = [];
	arr.sort();

	for (var i = 0; i < arr.length; i++) {
		if (arr[i] !== arr[i + 1]) {
			_arr.push(arr[i]);
		}
	}

	return _arr;
}

4.2 sort

// sort 返回新数组

function uniqueSort(arr) {
	var _arr = [];
	arr.sort();

	for (var i = 0; i < arr.length; i++) {
		if (arr[i] !== _arr[_arr.length - 1]) {
			_arr.push(arr[i]);
		}
	}

	return _arr;
}

5. es6 includes

function uniqueIncludes(arr) {
	var _arr = [];

	arr.forEach(function (item) {
		if (!_arr.includes(item)) {
			_arr.push(item);
		}
	});

	return _arr;
}

6. sort + reduce

function uniqueReduce(arr) {
	var _arr = [];
	return arr.sort().reduce(function (prev, elements) {
		if (prev.length === 0 || prev[prev.length - 1] !== elements) {
			prev.push(elements);
		}

		return prev;
	}, []);
	return _arr;
}

7. Map 对象

// map 键名可以是字符串也可以是对象
function uniqueMap(arr) {
	var _arr = [],
		_temp = new Map();
	for (let i = 0; i < arr.length; i++) {
		if (!_temp.get(arr[i])) {
			_temp.set(arr[i], 1);
			_arr.push(arr[i]);
		}
	}
	return _arr;
}

8. set

function uniqueSet(arr) {
	return Array.from(new Set(arr));
}