方法一:双重循环
function unique(array) {
if (array === null || !isArray(array)) return [];
// res用来存储结果
var res = [];
var resLength = res.length;
var arrLength = array.length;
for (var i = 0; i < arrLength; i++) {
for (var j = 0, j < resLength; j++ ) {
if (array[i] === res[j]) {
break;
}
}
// 如果array[i]是唯一的,那么执行完循环,j就应该等于resLength
if (j === resLength) {
res.push(array[i])
}
}
return res;
}
方法二:单循环 + indexOf
function unique(array) {
if (array === null || !isArray(array)) return [];
// res用来存储结果
var res = [];
var resLength = res.length;
var arrLength = array.length;
for (var i = 0; i < arrLength; i++) {
if (res.indexOf(array[i]) === -1) {
res.push(array[i]);
}
}
return res;
}
方法三:先排序再去重
function unique(array) {
// res用来存储结果
var res = [];
var sortedArray = array.concat().sort();
var sortedArrayLength = sortedArray.length;
var seen;
for (var i = 0; i < sortedArrayLength; i++) {
// 如果是第一个元素或者相邻的元素不相同
if (!i || seen !== sortedArray[i]) {
res.push(sortedArray[i]);
}
seen = sortedArray[i];
}
return res;
}
方法四:利用Object 的属性不唯一特性去重
function unique(array) {
var obj = {}; // obj用来存储数组值组成的对象
var res = []; // res用来存储结果
var arrLength = array.length;
for (var i = 0; i < arrLength; i++) {
if (!obj.hasOwnProperty(array[i])) {
res.push(array[i]);
obj.array[i] = true;
}
}
return res;
}
方法五:使用 ES5 新增 filter 函数
function unique(array) {
var res = array.filter(function (item, index, array) {
//indexOf判断的是第一次出现的位置,如果重复话位置就不对,就会返回false
return array.indexOf(item) === index;
});
return res;
}
方法六:使用 ES6 新增数据结构 Set 和 Map
set
结构实现:
function unique(array) {
return Array.from(new Set(array));
}
map
结构实现:
function unique(arr) {
const seen = new Map();
return arr.filter((item) => !seen.has(item) && seen.set(item, true));
}