Удаление дубликатов из массива в 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;
}