一段JS代码含义

fanercute 2012-01-30 03:45:14
下面这个函数是去除数组重复元素的,但中间一步 a={} 我怎么都没搞懂是咋回事,高手看看

function unique(data){
data = data || [];
var a = {}; //这是啥意思
len = data.length;
for (var i=0; i<len;i++){
var v = data[i];
if (typeof(a[v]) == 'undefined'){//还有这里
a[v] = 1;
}
}
data.length=0;
for (var i in a){
data[data.length] = i;
}
return data;
}
...全文
136 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
fanercute 2012-01-31
  • 打赏
  • 举报
回复
早上过来,又捣腾了一会,结合诸位的回帖提示,终于看明白了,下面贴出我的理解,请各位赐教

function unique(data){
data = data || []; //处理参数,当传入参数为某些类似undefined的值时,转换为空数组
var a = {}; //预置一个空对象
len = data.length;

for (var i=0; i<len;i++){ //遍历传入的数组
var v = data[i]; //获取数组元素值
if (typeof(a[v]) == 'undefined'){ //当数组元素值是第一次出现时,以 数组元素值 为 属性 添加到预置对象中,当出现重复值,则会跳过。
a[v] = 1;
}
}

//当遍历数组完成后,预置的对象被数组中不重复的值填充。

data.length=0; //清空传入数组
for (var i in a){ //遍历填充后的对象
data[data.length] = i; //逐一填充数组,这个地方写得有些技巧,利用填充数组后数组长度的变化来设置下标,十分巧妙。
}
return data; //填充完成,返回处理后的数组。
}
oggmm 2012-01-30
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 fanercute 的回复:]

引用 8 楼 aspwebchh 的回复:
JScript code

var a ={}
alert(typeof(a[2]))//说明根本没有 a[2]这个属性存在,所以typeof返回undefined

var b = {}
b[2] = 3
alert(typeof(b[2]))//b[2]属性存在,而且是个数值类型 所以返回number

但a不是一个空对象吗 哪……
[/Quote]

没赋值typeof就返回undefined 赋值之后就会有类型
不耐烦 2012-01-30
  • 打赏
  • 举报
回复
。。。。。。。。我的11楼呢
fanercute 2012-01-30
  • 打赏
  • 举报
回复
11楼哪去了
不耐烦 2012-01-30
  • 打赏
  • 举报
回复
[Quote=引用楼主 fanercute 的回复:]
下面这个函数是去除数组重复元素的,但中间一步 a={} 我怎么都没搞懂是咋回事,高手看看
JScript code

function unique(data){
data = data || [];
var a = {}; //这是啥意思
len = data.length;
for (var i=0; i<len;i++){
var ……
[/Quote]

代码没仔细看完 但大略可能就是我说的意思
1: a={} 什么意思
js访问数组只能用索引 (即0,1,2...)
给他转换成json 就可以通过‘值’来访问

例:

var a = [0,1,2,3]
var o = {
0:0,
1:1,
2:2,
3:3
}
alert(o[1])
这样就可以用过循环来比较
lhprince1 2012-01-30
  • 打赏
  • 举报
回复
你先看写基础的js对象的东西,回头再看这个吧
fanercute 2012-01-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 aspwebchh 的回复:]
JScript code

var a ={}
alert(typeof(a[2]))//说明根本没有 a[2]这个属性存在,所以typeof返回undefined

var b = {}
b[2] = 3
alert(typeof(b[2]))//b[2]属性存在,而且是个数值类型 所以返回number
[/Quote]
但a不是一个空对象吗 哪一步给它赋的值?
不耐烦 2012-01-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 fanercute 的回复:]

引用 6 楼 aspwebchh 的回复:
JScript code

function unique(data){
data = data || [];
var a = {}; //相当于 var a = new Object
len = data.length;
for (var i=0; i<len;i++){
v……
[/Quote]
理解一下 undefined 类型 意思是 定义了没有值
挨踢直男 2012-01-30
  • 打赏
  • 举报
回复
var a ={}
alert(typeof(a[2]))//说明根本没有 a[2]这个属性存在,所以typeof返回undefined

var b = {}
b[2] = 3
alert(typeof(b[2]))//b[2]属性存在,而且是个数值类型 所以返回number
fanercute 2012-01-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 aspwebchh 的回复:]
JScript code

function unique(data){
data = data || [];
var a = {}; //相当于 var a = new Object
len = data.length;
for (var i=0; i<len;i++){
var v = data[i];
……
[/Quote]
还是有一点不明白,为什么typeof(a[v])有时候是undefined,有时候是number呢
挨踢直男 2012-01-30
  • 打赏
  • 举报
回复
function unique(data){ 
data = data || [];
var a = {}; //相当于 var a = new Object
len = data.length;
for (var i=0; i<len;i++){
var v = data[i];
if (typeof(a[v]) == 'undefined'){//还有这里
a[v] = 1;
}
/*
比如说 data数组为 [1,1,1,2,3,4]
上面这段会使a对象变成
a[1] = 1
a[2] = 1
a[3] = 1
a[4] = 1
*/
}
data.length=0;
for (var i in a){
data[data.length] = i; //这里的i就是a对象中的属性名,将这些属性名赋给data数组
}
return data;
}
fanercute 2012-01-30
  • 打赏
  • 举报
回复
这个函数是去除数组重复元素的,我测试过确实有效,但它怎么实现的,那位高手讲解一下原理
fanercute 2012-01-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zongbo001 的回复:]
var a = {}; 代表创建一个空对象
[/Quote]
既然是空对象 那为什么有时候 typeof(a[v]) 有东西呢
三石-gary 2012-01-30
  • 打赏
  • 举报
回复
[Quote=引用楼主 fanercute 的回复:]
var a = {}; //这是啥意思
[/Quote]
创建一个空对象。。。
[Quote=引用楼主 fanercute 的回复:]
if (typeof(a[v]) == 'undefined'){//还有这里
[/Quote]
判断一下它的类型。。这个通俗讲就和有时候错误提示什么什么未定义那样。。应该是为了避免那个错误吧。。
zongbo001 2012-01-30
  • 打赏
  • 举报
回复
var a = {}; 代表创建一个空对象
hch126163 2012-01-30
  • 打赏
  • 举报
回复
var a = {}; 声明,并初始化一个变量。

{} 表示 object 对象
[] 表示数组。

json 语法

87,914

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧