2013-05-25 33 views
43

Na przykład mam taką tablicę;Usuwanie duplikatów elementów z tablicy

var arr = [1, 2, 2, 3, 4, 5, 5, 5, 6, 7, 7, 8, 9, 10, 10] 

Moim celem jest odrzucenie powtarzających się elementów z tablicy i uzyskanie końcowej tablicy w ten sposób;

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 

Jak można to osiągnąć w JavaScript?

UWAGA: tablica nie jest posortowana, wartości mogą być dowolną kolejnością.

+0

Mogłabyś pętli nad tablicy i skopiować wszystkie elementy na mapie. – Devolus

+0

@Devolus, który jest ważny tylko dla łańcuchów i liczb, nie można używać obiektu lub tablicy jako klucza indeksu. –

+0

To rozwiązanie, ale jest również rozwiązaniem brutalnej siły. Czy jest to mądrzejszy (skuteczny) sposób? –

Odpowiedz

145

Łatwiej użyciu Array.filter:

var unique = arr.filter(function(elem, index, self) { 
    return index === self.indexOf(elem); 
}) 
+1

Najprostszy i najbardziej efektywny sposób :) dzięki –

+0

dziękuję za najprostszą odpowiedź – Kishan

+4

jak to jest skuteczne? Dbałość o wyjaśnienie najgorszego przypadku czasu pracy zależy od tego, jak działa indexOf, jeśli działa on w czasie liniowym, wtedy najgorszy przypadek to O (n^2) – AbKDs

11

Jako elementy są jeszcze uporządkowane, nie trzeba budować mapę, istnieje szybkie rozwiązanie:

var newarr = [arr[0]]; 
for (var i=1; i<arr.length; i++) { 
    if (arr[i]!=arr[i-1]) newarr.push(arr[i]); 
} 

EDIT: Jeśli tablica nie jest posortowana, użyj mapę:

var newarr = (function(arr){ 
    var m = {}, newarr = [] 
    for (var i=0; i<arr.length; i++) { 
    var v = arr[i]; 
    if (!m[v]) { 
     newarr.push(v); 
     m[v]=true; 
    } 
    } 
    return newarr; 
})(arr); 

Należy pamiętać, że jest to znacznie szybsze niż zaakceptowana odpowiedź.

+1

Tablica nie zawsze jest sortowana. –

+0

To jest łatwiejsze niż to Ułatwia to podejście var m = []; arr.forEach (v => m [v] = true); var newarr = Object.keys (m); Łatwo, prawda? –

+0

To jest świetna odpowiedź.Zamiast tego użyłbym zestawu ES6, a nie obiektu, aby pozycje na liście nie musiały być ciągami. (Oczywiście, że nie była to opcja z powrotem, gdy odpowiedź została napisana.) –

6

można spróbować jak to przy użyciu jQuery

var arr = [1,2,2,3,4,5,5,5,6,7,7,8,9,10,10]; 
    var uniqueVals = []; 
    $.each(arr, function(i, el){ 
     if($.inArray(el, uniqueVals) === -1) uniqueVals.push(el); 
    }); 
+1

Wymaga jQuery. –

5

spróbuj wykonać z Removing duplicates from an Array(simple):

Array.prototype.removeDuplicates = function(){ 
    var temp=new Array(); 
    this.sort(); 
    for(i=0;i<this.length;i++){ 
    if(this[i]==this[i+1]) {continue} 
    temp[temp.length]=this[i]; 
    } 
    return temp; 
} 

Edit:

Kod ten nie wymaga sortowania:

Array.prototype.removeDuplicates = function(){ 
    var temp=new Array(); 
    label:for(i=0;i<this.length;i++){ 
     for(var j=0; j<temp.length;j++){//check duplicates 
      if(temp[j]==this[i])//skip if already present 
       continue label;  
     } 
     temp[temp.length] = this[i]; 
    } 
    return temp; 
} 

(Ale nie testowany kod!)

+1

Ta funkcja nie tylko usuwa duplikaty, ale także sortuje. Po co nakładać prototypy Arraya na tak specyficzną funkcję (która nie działałaby dla jakiegokolwiek typu tablicy, ponieważ większość nie może być bezpośrednio posortowana)? –

+0

Może lepiej przetestować nierówności i wyrzucić 'kontynuuj' – Matanya

+0

@Matanya Poprawiam swoją odpowiedź –

Powiązane problemy