请问,循环之后的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]这个元素