【视频教程】JS数组优雅去重-冰山工作室-沙翼-web前端

6次阅读

共计 2207 个字符,预计需要花费 6 分钟才能阅读完成。

视频教程 - 数组去重
案例分析:
随机生成 20 个 10 以内的数字
随机生成 10 以内数字

let arr = Array.from({length:20},=>Math.random()*10|0);
console.log(arr);
// 输出结果:
[5,4,7,0,0,0,8,0,2,9,3,0,0,1,5,9,2,8,6,0]

去重思路:

双层循环,外层循环元素,内层循环时比较值
值相同时,则删去这个值

利用 splice 直接在原数组进行操作

Array.prototype.distinct = function (){
var arr = this,
i,
j,
len = arr.length;

for(i = 0; i < len; i++){
for(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 = a.distinct();
console.log(b.toString()); //1,2,3,4,5,6,56

注意:删除相同值时,数组长度相应减一。
但是,我们要注意的是,此种方法会改变原数组的值,也就是说,我们改变了 arr 的结果。如果不想改变原数组改怎么办呢?
不改变原数组

Array.prototype.distinct = function(){
var arr = this,
result = [],
i,
j,
len = arr.length;

for(i = 0; i < len; i++){
for(j = i + 1; j < len; j++){
if(arr[i] === arr[j]){
j = ++i;
}
}
result.push(arr[i]);
}
return result;
}
var arra = [1,2,3,4,4,1,1,2,1,1,1];
arra.distinct()

此种方法,先创建一个空数组,然后利用双层循环,符合的,push 进 result 数组中,若遇到相同值,则直接跳过,不再进行 push 操作。这样,我们就避免了对原数组的操作。
这种方法解决了操作原数组的问题,但是,如果数组的值特别大怎么办?比如说,数组 arr 有 10000 个值,找到第一项后,比较数组后面的值,那我们需要比较 9999 次,找到第二项,需要比较 9998 次。但是,我们已经确定了,我们的结果集中,就 10 个数,这样显然不是我们想要的,怎么办呢?
为了提升性能,我们可以从结果集中进行比较。
indexOf 的使用

let rs = [];
for(let i=0;i<arr.length;i++){
if(rs.indexOf arr[i] === -1){
rs.push(arr[i])
}
};
console.log(rs)
通过 indexOf 方法,如果得到的值为 -1,则确定数组中不存在该值,这样,我们就把 arr[i],push 到数组中。这样我们就得到了去重后的数组。
既然我们想到了 indexOf 方法,那我们是不是还能有更加简便的方法来使数组去重呢?
仔细想想,我们就会想到,数组的 filter 方法。
数组的 filter 方法

console.log(arr.filter(function(element,index,self){
return self.indexOf(element) === index;
}));

element 是数组的每个值,index 是数组的索引,self 是数组本身。
当使用 indexOf 方法时,如果数组的每项的 indexOf 方法得到的值与数组索引相同,则证明此值第一次出现,如果数组的索引与 index 的值不相同,则证明不是第一次出现。
前面我们介绍的这些方法,都是使用数组本身的方法。其实在 js 中,还有一个特殊的东西,叫做对象。
对象去重法
var o={};
var new_arr=[];
for(var i=0;i<arr.length;i++){
var k=arr[i];
if(!o[k]){
o[k]=true;
new_arr.push(k);
}
}
console.log(new_arr)

这种方法利用到,对象的属性唯一行,来进行判断。
为什么要用到这种方法呢?其实前面的方法,都用到了双层循环,indexOf 也不例外,但是利用对象的 key 来做判断时,我们只用到了一次循环,这样就会大大增加运行的性能,利用对象去重也是这些方法中运行速度最快的一种。
前面介绍到的这些种方法,都是 ES3,ES5 中用到的方法,接下来我们介绍一下利用 ES6 来进行数组去重的方法。
在本文的开头,我们创建随机数组的时候,用到了 Array.from() 方法,在 ES6 中新增了 from 方法。接下来我们借助 from 方法和一些其他的方法来把数组进行去重。
form 方法
let rs = Array.from(arr);

// 得到与当前一样的数组
let rs= Array.from(new Set(arr));
// 利用 ES6 的 Set 方法进行去重。
console.log([…new Set(arr)]);
// 这种方法只用到了 13 个字符,也是数组去重最方便的方法。

总结:
数组去重在我们日常的开发中用到的比较少,但是我们要理解其中的逻辑,以便于我们更好的进行其他的开发任务。
关于我们
原始高清视频下载
视频讲解 - 提取码:q82t
QQ 答疑交流群:
600633658
我们的链接:
知乎 掘金 今日头条 新浪微博 前端网 思否 简书 B 站

正文完
 0