关于typescript:数组去重1

一个数组

let arr = [1,2,2,4,null,null,'3','abc',3,5,4,1,2,2,4,null,null,'3','abc',3,5,4];
let len = arr.length;

一,利用对象key值的唯一性辅助筛选数组

let obj = {};
for(let i =0; i<len; ++i){
  let tmp =  arr[i];
  if(obj[tmp] !== undefined){  // 对象中存在,筛除掉
     arr.splice(i,1);
     --i;
     continue;
  }
  obj[tmp] = tmp;  // 存入对象中
}

二,替换元素地位从而替换调 splice办法
第一种办法有个效率问题。splice实现删除性能不太好,以后项被删除后,随后每一项的索引都要向前挪动一位,数据量较宏大时,肯定会影响性能。
新思路:若以后元素反复,则与数组最初一位元素替换地位。i–再次进行判断即可,同时length–,操作数组的长度实现删除数组的最初一个元素,这样便不会影响到数组中其余元素。

let obj = {};
for(let i =0; i<len;++i){
  let tmp =arr[i];
  if(obj[tmp] !== undefined){
     arr[i] = arr[len-1];
     --len;
     --i;
     continue;
  }
  obj[tmp] = tmp;
}

三,filter和indexOf办法
filter() 不会对空数组进行检测。
filter() 不会扭转原始数组,属于纯函数。
返回 item 第一次呈现的地位等于以后的index的元素

let result = arr.filet((item,index)=>{
  arr.indexOf(item) === index; // 遍历上来,找到的永远是第一次呈现的值,第一次呈现的值索引值等于index
})

四,filter和Object.hasOwnProperty
hasOwnProperty() 办法:返回一个布尔值,示意对象本身属性中是否具备指定的属性

let obj = {};
arr.filter(item=>obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item ] = true))

五,用sort办法对数组进行一次排序。之后比拟前后元素是否相等

function unique(arr) {
    if(!Array.isArray(arr)){
        console.log("type error ,not a function")
        return
    }
    arr = arr.sort();
    let result = arr[0];
    for(let i = 1; i<arr.length;++i){
        if(arr[i] !== arr[i-1]){
            result.push(arr[i])
        }
    }
    return result
}

六,应用includes函数,外围代码就是在循环中进行includes判断
result.includes(arr[i]);
把循环替换掉,能够用reducer来解决

arr.reduce((pre,cur)=>pre.includes(cur) ? pre : [...pre,cur],[])

成果也是一样的。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理