解读给数组去重 - 对象辅助去重法

数组去重,其核心是去重功能,接下来我们看个例子,解析网络上的对象辅助去重法。

完善函数 unique 的功能。


function unique(numbers){
var i = 0;
var d = [];
var j = {};

for(;i < numbers.length;i++){
  if(!j[numbers[i]]){
    d.push(numbers[i]);
    j[numbers[i]] = 1;
    }
  }
return d;
}

unique([1,2,2,3,4,2,1])

j 是一个对象,它是去重的关键,它的作用如下:

1) 把 numbers 里的每一个数据作为 j 的key,并且给个key赋同样的值为1,展示如下

j =  {1: 1, 2: 1, 3: 1, 4: 1};

2) 对象有一个特点,如果这个key在对象里已经存在,再去操作它的时候,它不会新增加一个键值对,而只会修改原来的值,表现如下:

第一次循环    得到 j ={};

第二次循环    得到 j = {1:1};

第三次循环    得到 j = {1:1, 2:1}

第三次循环    得到 j = {1:1, 2:1}

此时J 不会变成  j = {1:1, 2:1 , 2:1} , 在对象里,如果这个key值已经存在了,是不会增加这个值,而是去修改这个值。 

for(;i < numbers.length;i++){
  if(!j[numbers[i]]){
    d.push(numbers[i]);
    j[numbers[i]] = 1;
    }
  }

接下来我们看这段代码,判断的作用。

if里面,首先是把 !j[numbers[i]] 转成布尔值。 你问我怎么转的? if判断的括号里是一个隐形转换,判断条件是否成立,第二 前面加了运算符 ! 也是转换成布尔值的方式。 两种都能够理解

我们先看看 j[numbers[i]   条件成立么? 我们根本没把numbers放到里面去,当然不成立, 反之 前面加一个 !  就代表成立。

以numbers 的数据作为key的键值对在 j 象里并没有,那就给他添加。添加后下次遇到同样的key的话,就不会再往 J 里添加了;

如果!j[numbers]的结果为true,表示现在的这个key在 j 中是没有的,就给 j 中添加一条对应的键值对 "j[number[i]] = 1"

如果!j[numbers]的结果为false,那说明现在这个key在 J 中已经存在,也说明拿numbers数组里的数据做为key的那个键值对已经在对象J 里了,这个时候,就不用再添加了,
所以if大括号里的代码就不会走

  

整个解析明白了吧。本文为本人原创,如有转载,必须取得作者同意,否则将视为侵权,将向百度进行申诉。

 

posted on 2017-08-18 16:45  宋王爷  阅读(104)  评论(0)    收藏  举报

导航