解读给数组去重 - 对象辅助去重法
数组去重,其核心是去重功能,接下来我们看个例子,解析网络上的对象辅助去重法。
完善函数 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大括号里的代码就不会走
整个解析明白了吧。本文为本人原创,如有转载,必须取得作者同意,否则将视为侵权,将向百度进行申诉。
浙公网安备 33010602011771号