数组去重的问题 为什么o[v]=1

请问,循环之后的if判断力,o[v]=1,是什么意思?谢谢。

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>

<script type="text/javascript">

var arr=[1 ,1 ,2, 3, 3, 2, 1];
Array.prototype.unique=function(){          //unique应该是自定义的,这个是往数组原型上添加一个函数(属性),以后各个你定义的数组都可以直接使用这个函数(属性)
    var ret=[];
    var o={};
    var len=this.length;
    for(var i=0; i<len; i++){
        var v=this[i];
        if(!o[v]){
            o[v]=1;
            ret.push(v);
        }
    }
    return ret;
}

alert(arr.unique());

</script>

</head>

<body>

</body>
</html>

要明白这几个数组的作用就知道为什么设置o[v]=1 了。
ret这个数组很明白,是存放结果用的。
了解o这个数组,需要关注for循环中,v这个值是获取到输入数组的值(i是输入数组的索引),所以v的取值依次是“1 ,1 ,2, 3, 3, 2, 1”,在if判断中,如果某个数被添加到ret中了,则在o这儿数组中做个标识,表示该数下次不用记入ret数组,也就是重复数组。

比如:取第一个1的时候,o数组为空,所以进入if条件,if执行完成后,o中存储的是1==>1,下次再取到v为1时,o[1]=1,所以不满足if条件,所以就不会再向ret数组中压入数据值了。也就是说o这个数组是来记录哪些数据已经添加到结果,用来判重使用的。

 for(var i=0; i<len; i++){
        var v=this[i];
        if(!o[v]){//如果没有添加过v变量所指的这个值,
            o[v]=1;//增加这个值,=1还是=2或者其他非零整数(零的话,在if(!o[v])就是true了),都可以,只要往里添加了v这个值就行了。
            ret.push(v);
        }
    }

o是个标志数组,o[v]=1 用来标志 v 已经出现过了。

要明白这几个数组的作用就知道为什么设置o[v]=1 了。
ret这个数组很明白,是存放结果用的。
了解o这个数组,需要关注for循环中,v这个值是获取到输入数组的值(i是输入数组的索引),所以v的取值依次是“1 ,1 ,2, 3, 3, 2, 1”,在if判断中,如果某个数被添加到ret中了,则在o这儿数组中做个标识,表示该数下次不用记入ret数组,也就是重复数组。

比如:取第一个1的时候,o数组为空,所以进入if条件,if执行完成后,o中存储的是1==>1,下次再取到v为1时,o[1]=1,所以不满足if条件,所以就不会再向ret数组中压入数据值了。也就是说o这个数组是来记录哪些数据已经添加到结果,用来判重使用的。

如果o这个对象里有对应的v,那么这个数就是重的,不然这个数就是要放到返回的内容中去。o[v]=1说明这个数已经有了。

if(!o[v])判断o中是否存在v属性,如果不存在,则o[v]=1把属性v添加到v中并给属性赋值为1
o[v]=1的目的就是把v添加到o中,=1为随便赋值。

if(!o[v]){
o[v]=1;
}
o是一个没有初始化的数组,所以默认数组元素都是0,0是假,非零就是真咯,然后给当前元素赋值为1,当v的值重复时前面已经给
o[v]赋值为1了,1是真,非真就是假咯,所以不会执行if()里的语句,恩恩,我就得就是这样了,感觉就为实现这么一个简单的功能,
没必要这么大费周折,

o[v]=0表示未访问过
访问过后用o[v]=1,表示访问过o[v]这个元素