js去数组中的重复元素function unique(data){
data = data || [];
var a = {};
for (var i=0; i<data.length; 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;
}
data = data || [];
var a = {};
for (var i=0; i<data.length; 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;
}
//理解{}解构的话,应该就能理解了
function unique(data){
data = data || [];//防止data是null
var a = {};
for (var i=0; i<data.length; i++) {
var v = data[i];
//如果a[v]是空的,即a里面还没有v这个键,则加入,因为键是唯一的,所以达到了去除重复的目的
if (typeof(a[v]) == 'undefined'){
a[v] = 1;//等于1不是必须,等于10,等于'abc'都无所谓
}
}
data.length=0;//清理原来的数组
for (var i in a){//遍历键,把键存入数组
data[data.length] = i;
}
return data;
}
// 例如调用时 var tData = ['a', 'b', 'c', 'a', 'e']; unique(tData);
function unique(data){
data = data || []; // 保证数据可用
var a = {}; // 注册容器
// 迭代data数组 注册值
for (var i=0; i<data.length; i++) {
var v = data[i]; // v在每轮迭代中分别表示'a', 'b', 'c', 'a', 'e'
// 此处检查,如果注册容器a中没有找到key是data中已有的值,则将其注册
// 反之则跳过
if (typeof(a[v]) == 'undefined'){
a[v] = 1;
}
};
// 循环结束后a的值为
// a = {'a':1, 'b':1, 'c':1, 'e':1}
// 可以看到a对象中键的就是已经去了重的data数据
// 剩下的就是要将a中的键重新组成一个新的数组
// 重置数组 切不切断对象引用
data.length=0;
// 此时外部tData成为了一个空数组,同时与tData持有相同引用的函数内部的data也是一个空数组
// 将注册容器中的key作为值组成一个数组重新填入data中
for (var i in a){ // 对a中的属性进行迭代 每轮迭代 i 的值分别是 'a', 'b', 'c', 'e'
data[data.length] = i; // 这里正好根据每轮迭代的i重新填入data数组
}
// 此时因为tData与data持有相同的对象引用,所以他们的值都是
// ['a', 'b', 'c', 'e']
// 这个return其实不是必须的
// 因为上面的所有操作中data变量都没有更换对象引用
// 在函数内部对data的操作对外部传入的对象已经起作用
return data;
}
function unique(data){
data = data || []; // 保证数据可用
var a = {}; // 注册容器
// 迭代data数组 注册值
for (var i=0; i<data.length; i++) {
var v = data[i]; // v在每轮迭代中分别表示'a', 'b', 'c', 'a', 'e'
// 此处检查,如果注册容器a中没有找到key是data中已有的值,则将其注册
// 反之则跳过
if (typeof(a[v]) == 'undefined'){
a[v] = 1;
}
};
// 循环结束后a的值为
// a = {'a':1, 'b':1, 'c':1, 'e':1}
// 可以看到a对象中键的就是已经去了重的data数据
// 剩下的就是要将a中的键重新组成一个新的数组
// 重置数组 切不切断对象引用
data.length=0;
// 此时外部tData成为了一个空数组,同时与tData持有相同引用的函数内部的data也是一个空数组
// 将注册容器中的key作为值组成一个数组重新填入data中
for (var i in a){ // 对a中的属性进行迭代 每轮迭代 i 的值分别是 'a', 'b', 'c', 'e'
data[data.length] = i; // 这里正好根据每轮迭代的i重新填入data数组
}
// 此时因为tData与data持有相同的对象引用,所以他们的值都是
// ['a', 'b', 'c', 'e']
// 这个return其实不是必须的
// 因为上面的所有操作中data变量都没有更换对象引用
// 在函数内部对data的操作对外部传入的对象已经起作用
return data;
}