目录
利用利用indexOf和lastIndexOf,for循环break(或者forEach try catch)
一、数组去重
利用两个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>
二、找出数组重复的元素
-
利用利用indexOf和lastIndexOf
思路:遍历每一项,新建res数组保存结果。利用indexOf和lastIndexOf,当两者不相等,并且res数组中没有这个元素的时候,说明这个元素第一次重复,push进结果数组
<script type="text/javascript">
function findRepeat(arr) {
var res = [];
arr.forEach(function(item) {
if(arr.indexOf(item) !== arr.lastIndexOf(item) && res.indexOf(item) == -1) {
res.push(item);
}
});
return res;
}
var arr1 = [1,"1",2,1,3,2,3,3];
console.log(findRepeat(arr1));// [1,2,3]
</script>
三、找出数组第一个不重复的元素
-
利用利用indexOf和lastIndexOf,for循环break(或者forEach try catch)
思路:遍历每一项,一旦发现indexOf和lastIndexOf相等,就可以跳出循环。如果用for遍历,可以用break跳出去。如果用forEach遍历,只能用try catch语句块跳出遍历。本程序用try catch
<script type="text/javascript">
function firstNoRepeat(arr) {
var res = [];
try{
arr.forEach(function(item) {
if(arr.indexOf(item) === arr.lastIndexOf(item)) {
res.push(item);
throw new Error("找到啦!");
}
});
}catch(err){
}
return res;
}
var arr2 = [1,"1",2,1,3,2,3,3];
console.log(firstNoRepeat(arr2));// ["1"]
</script>