Получить все уникальные значения в массиве 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 ]

3 голосов
/ 03 мая 2019

Я думаю, что это самый простой способ получить уникальный элемент из массива.

var arr = [1,2,4,1,4];
arr = Array.from(new Set(arr))
console.log(arr)
3 голосов
/ 18 июля 2013

Я обнаружил, что сериализация их хеш-ключа помогла мне заставить это работать для объектов.

Array.prototype.getUnique = function() {
        var hash = {}, result = [], key; 
        for ( var i = 0, l = this.length; i < l; ++i ) {
            key = JSON.stringify(this[i]);
            if ( !hash.hasOwnProperty(key) ) {
                hash[key] = true;
                result.push(this[i]);
            }
        }
        return result;
    }
2 голосов
/ 12 июля 2012

Вы также можете использовать jQuery

var a = [1,5,1,6,4,5,2,5,4,3,1,2,6,6,3,3,2,4];

// note: jQuery's filter params are opposite of javascript's native implementation :(
var unique = $.makeArray($(a).filter(function(i,itm){ 
    // note: 'index', not 'indexOf'
    return i == $(a).index(itm);
}));

// unique: [1, 5, 6, 4, 2, 3]

Первоначально ответили по адресу: Функция jQuery для получения всех уникальных элементов из массива?

2 голосов
/ 16 августа 2013

Основываясь на других ответах, вот еще один вариант, который принимает необязательный флаг для выбора стратегии (сохранить первое вхождение или сохранить последнее):

Без расширения Array.prototype

function unique(arr, keepLast) {
  return arr.filter(function (value, index, array) {
    return keepLast ? array.indexOf(value, index + 1) < 0 : array.indexOf(value) === index;
  });
};

// Usage
unique(['a', 1, 2, '1', 1, 3, 2, 6]); // -> ['a', 1, 2, '1', 3, 6]
unique(['a', 1, 2, '1', 1, 3, 2, 6], true); // -> ['a', '1', 1, 3, 2, 6]

Расширение Array.prototype

Array.prototype.unique = function (keepLast) {
  return this.filter(function (value, index, array) {
    return keepLast ? array.indexOf(value, index + 1) < 0 : array.indexOf(value) === index;
  });
};

// Usage
['a', 1, 2, '1', 1, 3, 2, 6].unique(); // -> ['a', 1, 2, '1', 3, 6]
['a', 1, 2, '1', 1, 3, 2, 6].unique(true); // -> ['a', '1', 1, 3, 2, 6]
2 голосов
/ 16 мая 2013

Это будет работать.

function getUnique(a) {
  var b = [a[0]], i, j, tmp;
  for (i = 1; i < a.length; i++) {
    tmp = 1;
    for (j = 0; j < b.length; j++) {
      if (a[i] == b[j]) {
        tmp = 0;
        break;
      }
    }
    if (tmp) {
      b.push(a[i]);
    }
  }
  return b;
}
2 голосов
/ 13 июля 2018

Сделайте это с lodash и тождественной лямбда-функцией, просто определите ее перед использованием вашего объекта

const _ = require('lodash');
...    
_.uniqBy([{a:1,b:2},{a:1,b:2},{a:1,b:3}], v=>v.a.toString()+v.b.toString())
_.uniq([1,2,3,3,'a','a','x'])

и будет иметь:

[{a:1,b:2},{a:1,b:3}]
[1,2,3,'a','x']

(это самый простой способ)

2 голосов
/ 21 апреля 2015

Посмотри на это. Jquery предоставляет метод uniq: https://api.jquery.com/jQuery.unique/

var ids_array = []

$.each($(my_elements), function(index, el) {
    var id = $(this).attr("id")
    ids_array.push(id)
});

var clean_ids_array = jQuery.unique(ids_array)

$.each(clean_ids_array, function(index, id) {
   elment = $("#" + id)   // my uniq element
   // TODO WITH MY ELEMENT
});
2 голосов
/ 29 марта 2015

Используя ключи объекта для создания уникального массива, я попробовал следующее

function uniqueArray( ar ) {
  var j = {};

  ar.forEach( function(v) {
    j[v+ '::' + typeof v] = v;
  });


  return Object.keys(j).map(function(v){
    return j[v];
  });
}   

uniqueArray(["1",1,2,3,4,1,"foo", false, false, null,1]);

Что возвращает ["1", 1, 2, 3, 4, "foo", false, null]

2 голосов
/ 21 октября 2015

Если у вас есть мощный метод уменьшение ( & ge; 5.1 ), вы можете попробовать что-то вроде этого:

Array.prototype.uniq = function() {
  return this.reduce(function(sofar, cur) {
    return sofar.indexOf(cur) < 0 ? sofar.concat([cur]) : sofar;
  }, []);
};

Это не самая эффективная реализация (из-за проверки indexOf, которая в худшем случае может пройти весь список). Если эффективность имеет значение, вы можете сохранить «историю» вхождений в какой-либо структуре с произвольным доступом (скажем, {}) и вместо этого ввести их. Это в основном то, что делает наиболее проголосовавший ответ , так что посмотрите на пример.

1 голос
/ 08 сентября 2013
Array.prototype.unique = function() {
    var a = [],k = 0,e;
    for(k=0;e=this[k];k++)
      if(a.indexOf(e)==-1)
           a.push(e);
    return a;
}
[1,2,3,4,33,23,2,3,22,1].unique(); // return [1,2,3,4,33,23,22]
...