О массиве Javascript, уникальном - PullRequest
4 голосов
/ 17 декабря 2011
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'], мы можем исправить это объявление?

Ответы [ 2 ]

3 голосов
/ 17 декабря 2011

Имена ключей всегда преобразуются в строку. Я рекомендую использовать 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 голос
/ 17 декабря 2011

Когда число 12 использовалось в качестве ключа словаря, оно переводилось в строку, превращая его в тот же ключ, что и последняя строка '12'

...