数组API之数组去重
数组API数组去重新开一个数组的方式新开一个数组,遍历原数组,每次遍历时判断当前项是否已经在新数组中,那不在就push加到新数组中;已经存在就什么都不做,就不push了。let arr=[23,56,78,36,36,78,23,11,89];let newArr=[];for(let i=0;i<arr.length;i++){if(!newArr.includes(arr[i])){ne
·
数组API
数组去重
新开一个数组的方式
新开一个数组,遍历原数组,每次遍历时判断当前项是否已经在新数组中,那不在就push加到新数组中;已经存在就什么都不做,就不push了。
let arr=[23,56,78,36,36,78,23,11,89];
let newArr=[];
for(let i=0;i<arr.length;i++){
if(!newArr.includes(arr[i])){
newArr.push(arr[i]);
}
}
newArr=[];
arr.forEach(item=>{
// 因为这是一个方法,不是一个循环
// 要使用return不能使用continue/break
// 函数体中遇到return下面代码不再执行
if(newArr.includes(item)) return;
newArr.push(item);
})
console.log(newArr);
删掉重复的
循环原数组,把每一项拿出来,跟它后面的比较,遇到相同的则删除。但删除的时候一定要注意数组塌陷问题。
!!!
边循环边删除的时候,容易有数组塌陷问题:
前面的元素被删除了,所以后面的元素的索引都自动往前移了一位
从数组中任意一个位置移除某一项:splice
let arr=[23,56,78,36,36,78,23,11,89,78,78];
for(let i=0;i<arr.length;i++){
for(let j=i+1;j<arr.length;j++){
if(arr[j]===arr[i]){
arr.splice(j,1);
j--;
}
}
}
console.log(arr);
对象法
let arr=[23,56,78,36,36,78,23,11,89,78,78];
let obj={}
newArr=[];
for(let i=0;i<arr.length;i++){
if(!obj[arr[i]]){
newArr.push(arr[i]);
obj[arr[i]]=1;
}
}
console.log(newArr);
这里有一点要注意的:基于splice实现删除性能不太好,因为所有后面的元素都要往前挪一位
方案:把最后一项替换当前这一项,然后把最后一项删掉
封装成unique方法
比较新颖的正则的方法
let arr=[23,56,78,36,36,78,23,11,89,78,78];
arr.sort((a,b)=>a-b);
let str=arr.join('|')+'|';
console.log(str);
// let reg=/([0-9]*\|)(?=(\1))/g
let reg=/([0-9]*\|)(\1)*/g
// 用后行断言的时候不好用分组
// let reg=/(?<=\1)([0-9]*\|)/g
console.log(str.match(reg));
console.log('---替换---')
let newArr=[];
str=str.replace(reg,(_,match1)=>{
let num=Number(match1.slice(0,match1.length-1))
newArr.push(num);
return match1;
})
console.log(str);
console.log(newArr);
set集合的方法
更多推荐
已为社区贡献1条内容
所有评论(0)