乐趣区

关于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],[])

成果也是一样的。

退出移动版