最近待业在家, 系统地学习了一套 JS 的课程. 虽然工作时间真的比较长了, 但有些东西只局限在知其然而不知其所以然的程度上, 有些知识点通过 "血和泪" 的经验积累下来, 也只是记了结果并没有深究, 所以每次听完课都有些收获. 想起 2018 年的新年目标上有一条是至少更新 50 篇博客, 结果......, 呵呵, 所以打算在 19 年剩下的这些天里, 实现 18 年未达成的目标.
现在进入正题, 相信很多面试者会被问到这样一道题 (我就碰到过至少 2 次),JS 实现数组(只有正整数) 去重有几种方法? 最直接的想到的应该是双层循环进行比对, 不等于 push, 等于不做处理, 最后返回得到新数组就是去重后的数组, 以下是代码:
- var x = [1,2,3,4,1,4,3,5,2];
- var y = [];
- for(var i = 0;i < x.length; i++){
- for(var j = 0;j < y.length;j++){
- if(y[j] === x[i]){
- break;
- }
- }
- if(j == y.length){
- y.push(x[i]);
- }
- }
- console.log(y.join(''));
第二种方法, 一般人也可以想到, 就是先将数组排序, 然后判断相邻的两个元素是否相等, 等于忽略, 不等于 push, 代码是:
- var x = [1,2,3,4,1,4,3,5,2];
- var y = [];
- var newx = x.sort();
- y.push(newx[0]);
- for(var i=1;i<newx.length;i++){
- if(newx[i] != newx[i-1]){
- y.push(newx[i])
- }
- }
- console.log(y.join(''));
第三种方法可能一般就不会想到, 也很简单, 就是使用对象的属性, 将数组中的元素当做对象的 key,key 重复会被覆盖, 然后再用 for in 把 key 遍历出来, 实现代码是:
- var x = [1,2,3,4,1,4,3,5,2];
- var y = [];
- var arrMap = [];
- for(var i = 0;i < x.length;i++){
- arrMap[x[i]] = true;
- }
- for(var j in arrMap){
- y.push(+j);
- }
- console.log(y.join(''));
值得注意的是这种方法会把数组元素转换为字符串, 所以 y.push(+j);"+" 是将字符串又转换为整数.
如果问题升级, 不只是整数, 里面可能会包含布尔值, 字符串, 甚至 undefined,null 等, 怎么办呢? 第一种方法是完全适合的(判断一定要有严格等于 ===), 而后两种就需要在之前做一些处理, 遍历数组, 根据元素类型将元素分成几部分, 再将每部分做以上处理, 最后再合并.
2019 年第一篇 over!
来源: http://www.bubuko.com/infodetail-3294354.html