关于Javascript数组去重

4
var arr1 = [12,'ss','sdd','sdd','kk'];
function unique(array){
  var o = {},b = [];
  for(var i=0;i<array.length;i++){
     if(!o[array[i]]){
       b.push(array[i]);
       o[array[i]] = true;
     }
  }
  return b;
}
unique(arr1) //It works fine .output [12,'ss','sdd','kk']

but,it has some issues on arr2 below:

var arr2 =  [12,'ss','sdd','sdd','kk','12'];//output [12,'ss','sdd','kk']

这有问题吗?我认为它应该输出[12,'ss','sdd','kk','12'],我们能解决这个问题吗?


var i=0 后面的逗号应该改为分号。 - Rob W
2个回答

3

键名总是被转换为字符串。我建议使用 Array.prototype.indexOf 来检查数组条目是否唯一。 indexOf 方法在处理对象时也表现正确[1]

演示:http://jsfiddle.net/YE9jx/

function unique(array){
  var b = [];
  for(var i=0; i<array.length; i++){
     if(b.indexOf(array[i]) == -1) b.push(array[i]);
  }
  return b;
}

[1] 正确的行为是:当对象引用不同时,结果也不同:

var obj1 = [1,2];
var obj2 = [1,2];
unique([obj1, obj2]);  //[[1,2], [1,2]]  // Because they're different arrays
unique([obj1, obj1]);  //[[1,2]]         // Because both elements are obj1

+1。但请注意,并非所有浏览器都支持 Array.indexOf() - 如果您想允许此功能,可以添加在MDN中显示的代码。 - nnnnnn

1

当数字12被用作字典键时,它被提升为字符串,使其成为与上一个字符串'12'相同的键。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接