Получить все уникальные значения в массиве JavaScript (удалить дубликаты) - PullRequest
1123 голосов
/ 25 декабря 2009

У меня есть массив чисел, которые я должен убедиться, что они уникальны. Я нашел фрагмент кода ниже в интернете, и он прекрасно работает, пока в массиве нет нуля. Я нашел этот другой скрипт здесь, на SO, который выглядит почти так же, как и он, но он не дает сбоя.

Итак, ради того, чтобы помочь мне учиться, может ли кто-нибудь помочь мне определить, где происходит ошибка прототипа сценария?

Array.prototype.getUnique = function() {
 var o = {}, a = [], i, e;
 for (i = 0; e = this[i]; i++) {o[e] = 1};
 for (e in o) {a.push (e)};
 return a;
}

Больше ответов на повторяющийся вопрос:

Аналогичный вопрос:

Ответы [ 70 ]

0 голосов
/ 29 ноября 2018

Ответ на объект выше, кажется, не работает для меня в моем случае использования с объектами.

Я изменил это следующим образом:

var j = {};

this.forEach( function(v) {
   var typ = typeof v;
   var v = (typ === 'object') ? JSON.stringify(v) : v;

   j[v + '::' + typ] = v;
});

return Object.keys(j).map(function(v){
  if ( v.indexOf('::object') > -1 ) {
    return JSON.parse(j[v]);
  }

  return j[v];
});

Похоже, теперь это работает правильно для объектов, массивов, массивов со смешанными значениями, логических значений и т. Д.

0 голосов
/ 15 ноября 2016

Если вы хотите изменить его на месте (не создавая новый массив), вы можете просто:

var
  uniq = function uniq(array) {
    var
      len = array.length;

    while (len--) {
      if (array.indexOf(array[len]) !== len) {
        array.splice(len, 1);
      }
    }

    return array;
  },

  myArray = [1, 2, 2, 4, 2];

console.log(uniq(myArray));
// [1, 2, 4];
0 голосов
/ 07 декабря 2013

Еще один ответ, просто потому, что я написал один для моего конкретного случая использования. В любом случае мне пришлось сортировать массив, и, учитывая, что я сортирую, я могу использовать его для дедупликации.

Обратите внимание, что моя сортировка имеет дело с моими конкретными типами данных, вам может потребоваться другая сортировка в зависимости от того, какие у вас элементы.

var sortAndDedup = function(array) {
  array.sort(function(a,b){
    if(isNaN(a) && isNaN(b)) { return a > b ? 1 : (a < b ? -1 : 0); }
    if(isNaN(a)) { return 1; }
    if(isNaN(b)) { return -1; }
    return a-b;
  });

  var newArray = [];
  var len = array.length;
  for(var i=0; i<len; i++){
    if(i === 0 || array[i] != array[i-1]){
      newArray.push(array[i]);
    }
  }
};
0 голосов
/ 19 ноября 2015
var a = [1,4,2,7,1,5,9,2,4,7,2]
var b = {}, c = {};
var len = a.length;
for(var i=0;i<len;i++){
  a[i] in c ? delete b[a[i]] : b[a[i]] = true;
  c[a[i]] = true;
} 

// b contains all unique elements
0 голосов
/ 18 февраля 2019

Иногда мне нужно получать уникальные вхождения из массива объектов. Lodash кажется хорошим помощником, но я не думаю, что фильтрация массива оправдывает добавление зависимости в проект.

Давайте предположим, что сравнение двух объектов представляет собой сравнение свойства, например, id.

const a = [{id: 3}, {id: 4}, {id: 3}, {id: 5}, {id: 5}, {id: 5}];

Так как мы все любим отрывки из одной строки, вот как это можно сделать:

a.reduce((acc, curr) => acc.find(e => e.id === curr.id) ? acc : [...acc, curr], [])

0 голосов
/ 26 августа 2015

Используйте .toString () для строк.

var givenvalues = [1,2,3,3,4,5,6];
var values = [];
for(var i=0; i<givenvalues.length; i++)
{
    if(values.indexOf(givenvalues[i]) == -1)
    {
        values[values.length] = givenvalues[i];
    }
}
0 голосов
/ 03 июля 2013

Если порядок не важен, мы можем создать хеш и получить ключи для создания уникального массива.

var ar = [1,3,4,5,5,6,5,6,2,1];
var uarEle = {};
links.forEach(function(a){ uarEle[a] = 1; });
var uar = keys(uarEle)

uar будет иметь уникальные элементы массива.

0 голосов
/ 24 августа 2015
 Array.prototype.unique=function(){ 

   var cr=[];

  this.forEach(function(entry) {
   if(cr.indexOf(entry)<0){
     cr.push(entry);
   }else{
    var index = cr.indexOf(entry);
    if (index > -1) {
     cr.splice(index, 1);
      }
   } 

 });

 return cr;
}
0 голосов
/ 25 декабря 2009

Не цитируйте меня по этому поводу, но я думаю, что вам нужно использовать строку для имени вашего свойства, например o[e.toString()], а затем преобразовать ее обратно, когда вы ее нажмете.

0 голосов
/ 08 января 2017

(function() {
    "use strict";

    Array.prototype.unique = function unique() {
        var self = this;
        return self.filter(function(a) {
            var that = this;
            // console.log(that);
            return !that[a] ? that[a] = true : false;
        }, {});
    }

    var sampleArray = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
    var distinctArray = sampleArray.unique();
    console.log(distinctArray);
})();
Here is the simple way to solve this problem...
...