利用两个for循环和push方法
思路:利用两个for循环.遍历数组中的每一项,对每一项又遍历这项后面的每一项。也就是将当前元素与他后面的所有元素作比较,只要碰到与当前元素相等的情况,利用j = ++i重新开始外层大循环。直到其后面没有重复的元素就push进新数组
<script type="text/javascript">
function distinct(arr){
var result = [],
len = arr.length;
for(var i = 0; i < len; i++){
for(var j = i + 1; j < len; j++){
if(arr[i] === arr[j]){
j = ++i;//i和j分别加1,外层大循环重新开始
}
}
result.push(arr[i]);
}
return result;
}
var arra = [1,2,3,4,4,1,1,2,1,1,1];
console.log(distinct(arra)); //返回[3,4,2,1]
</script>
利用两个for循环和splice方法
思路 对数组中的每一项,与该项后面的每一项比较,若相同,就删掉后面的相同项
<script type="text/javascript">
function distinct(arr){
var len = arr.length;
for(var i = 0; i < len; i++){
for(var j = i + 1; j < len; j++){
if(arr[i] == arr[j]){
arr.splice(j,1);
len--;
j--;// 进行下一次遍历
}
}
}
return arr;
};
var a = [1,2,3,4,5,6,5,3,2,4,56,4,1,2,1,1,1,1,1,1,];
var b = distinct(a);
console.log(b); //1,2,3,4,5,6,56
</script>
利用sort和splice
思路:先用sort方法将数组排序,然后在老数组中循环遍历,将当前项与他的后一项比较,如果相等就删除当前项,并且进行i--和len--继续遍历
<script type="text/javascript">
function distinct(arr) {
var len=arr.length;
arr.sort((a,b) => a - b ); // 对数组进行排序
for(var i = 0;i < len;i ++ ){
if(arr[i] == arr[i+1]){
arr.splice(i,1); // 删掉当前项
len--;
i--;
}
}
return arr;
};
var arra = [1,2,3,4,4,1,1,2,1];
var b = distinct(arra);
console.log(b); // [1,2,3,4]
</script>
利用对象属性的不重复性
思路:利用对象的属性不能相同的特性.将数组中的每一项当做对象的属性名,属性名是不可以重复的。新建一个对象obj,遍历数组中的每一项,如果!obj[arr[i]]为true,就将该值push进结果数组
<script type="text/javascript">
function distinct(arr) {
var i;
var obj = {};
var result = [];
var len = arr.length;
for(i = 0;i < len;i ++){
if(!obj[arr[i]]){
obj[arr[i]] = 1;//通过变量访问属性,用[]
result.push(arr[i]);
}
}
console.log(obj);
return result;
};
var a = [1,4,6,4,4,4,4,4,6,1,1]
var b = distinct(a);
console.log(b); // [1,4,6]
</script>
利用indexOf和push
思路:对于老数组中的每一项,在新数组中进行查找,如果没有(返回-1),push进去
<script type="text/javascript">
function distinct(arr) {
var i;
var len = arr.length;
var res = [];
// for(i = 0;i < len;i ++){
// if(res.indexOf(arr[i]) === -1){
// res.push(arr[i]);
// }
// }
// 可以用forEach(或者map\filter)代替上面的for循环,注意传入的函数的三个参数分别为item,index,array
arr.forEach(function(item){
if(res.indexOf(item) === -1){
res.push(item);
}
})
return res;
};
var arra = [1,2,4,2,1,24,4,3,4,2,1,3,3];
var arrb = distinct(arra);
console.log(arrb);
</script>
利用set对象和拓展运算符
思路:ES6中的set是一个类似于数组的对象,其属性不能重复。利用Array.from或者拓展运算符将其转化为数组
<script type="text/javascript">
function distinct(array){
// return Array.from(new Set(array));
return [... new Set(array)]//用[...A]将A转换为数组
}
var arr1 = [2,1,2,2,1,34,3,5,54,221,1,1,2,3,12];
var arr2 = distinct(arr1);
console.log(arr2);
</script>
本文分享自微信公众号 - 国产程序员(Monday_lida)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
来源:oschina
链接:https://my.oschina.net/u/4254317/blog/4389750