【问题标题】:About the Javascript Array unique关于 Javascript 数组唯一性
【发布时间】:2011-12-17 10:09:10
【问题描述】:
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 后面的逗号应该是分号。

标签: javascript arrays unique


【解决方案1】:

键名始终转换为字符串。我建议使用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() - 如果您想允许这样做,您可以添加显示的代码here at MDN
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    相关资源
    最近更新 更多