方法一
双层for循环,将数组元素压入新数组
Array.prototype.distinct=function(){
var arr=this,result=[];
var j;
for(let i=0;i<arr.length;i++)
{
for(j=0;j<result.length;j++)
{
if(arr[i]==result[j])
break;
}
if(j==result.length)
result.push(arr[i])
}
return result;
}
var arra = [1, 'a', 'a', 'b', 'd', 'e', 'e', 1, 0, 2, 2, 3];
console.log(arra.distinct());//[ 1, "a", "b", "d", "e", 0, 2, 3 ]
方法二
单层for循环+新数组+新对象。将数组元素作为对象的属性。
Array.prototype.distinct=function(){
let arr=this;
let newArr = [];
let obj = {};
for (let i = 0; i < arr.length; i++) {
if (!obj[typeof arr[i] + arr[i]]) {//防止string和int有“相同”的值等情况,如‘11’和11
obj[typeof arr[i] + arr[i]] = 1;
newArr.push(arr[i]);
}
}
return newArr;
}
var arra = [1, 'a', 'a', 'b', 'd', 'e', 'e', 1, 0, 2, 2, 3];
console.log(arra.distinct());//[ 1, "a", "b", "d", "e", 0, 2, 3 ]
方法三
单层for循环+sort排序+新数组。数组排序之后,遍历,与新数组最后一个元素比较。
Array.prototype.distinct=function(){
var arr=this;
arr.sort();
let result=[arr[0]];
for(let i=1;i<arr.length;i++)
{
if(arr[i]!=result[result.length-1])
result.push(arr[i]);
}
return result;
}
var arra = [1, 'a', 'a', 'b', 'd', 'e', 'e', 1, 0, 2, 2, 3];
console.log(arra.distinct());//[ 0, 1, 2, 3, "a", "b", "d", "e" ]
方法四
foreach+indexof方法
使用foreach遍历数组,使用indexof函数判断每个元素第一次出现的索引位置是否和遍历位置相同
Array.prototype.distinct=function(){
var arr=this,result=[];
arr.forEach(function(val,index){
if(arr.indexOf(val)==index)
result.push(val);
})
return result;
}
var arra = [1, 'a', 'a', 'b', 'd', 'e', 'e', 1, 0, 2, 2, 3];
console.log(arra.distinct());//[ 1, "a", "b", "d", "e", 0, 2, 3 ]
方法五
使用ES6的set
Array.prototype.distinct=function(){
var arr=this;
return Array.from(new Set(arr));
}
var arra = [1, 'a', 'a', 'b', 'd', 'e', 'e', 1, 0, 2, 2, 3];
console.log(arra.distinct());//[ 1, "a", "b", "d", "e", 0, 2, 3 ]