Удаление дубликатов из массива в Javascript

var data = localStorage.getItem('oldData').split(" ");

Я обращаюсь к localStorage, как указано выше, и получаю массив значений. Некоторые элементы повторяются в строковом значении для oldData, например:

apples oranges apples apples

Я хочу, чтобы данные имели только два элемента apples и oranges. Как я могу сделать это в Javascript?

Ответ 1

Вот что я использовал наконец

var data = localStorage.getItem('oldData').split(" ");

var sdata = data.sort();
var udata = [];
var j = 0;
udata.push(sdata[0]);
for (var i = 1; i < data.length - 1; i += 1) {
    if (sdata[i] != udata[j]) {
        udata.push(sdata[i]);
        j++;
    }
}

Ответ 2

Array.prototype.unique = function(){
  return Object.keys(this.reduce(function(r,v){
    return r[v]=1,r;
  },{}));
}

Наденьте его. Это O (n), потому что для использования объекта требуется только однократное прохождение массива и назначение в нем каждого значения в качестве ключа, переписывание по мере того, как вы идете. Это работает только тогда, когда значения являются примитивами (или у вас есть Harmony WeakMaps). Но это почти всегда тот массив, который вы хотите сделать, чтобы он работал.

Для бонусов здесь второй лучший способ сделать это. Это минимально в два раза быстрее, чем обычные двойные петлевые ответы, и, как минимум, такие же, как те, которые требуют предварительной сортировки, (но еще хуже, чем вышеупомянутый хэш-метод, который бесконечно быстрее).

Array.prototype.unique = function(){
  return this.filter(function(s, i, a){
    return i == a.lastIndexOf(s);
  });
}

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

Ответ 3

сначала вставить одно значение в ваш массив, используя push

var array = [];
array.push("newvalue");

затем следующую вставку значения, проверьте, существует ли ваше значение в вашем массиве, используя "for loop". то, если значение не существует, вставьте это значение, используя push() снова

Ответ 4

Array.prototype.unique = function()
{
    var a = [];
    var l = this.length;
    for(var i=0; i<l; i++)
    {
        for(var j=i+1; j<l; j++)
        { if (this[i] === this[j]) j = ++i; }
        a.push(this[i]);
    }
    return a;
};

Ответ 5

Что-то вроде этого должно сделать трюк:

uniqueValues = function(array) {
    var i, value,
    l = array.length
    set = {}, 
    copy = [];

    for (i=0; i<l; ++i) {
        set[array[i]] = true;
    }

    for (value in set) {
        if (set.hasOwnProperty(value)) {
            copy.push(value);
        }
    }

    return copy;
 }