2012-10-04 10 views
8

Powiel możliwe:
Easiest way to find duplicate values in a JavaScript arrayJak przeszukiwać tablicę w JavaScript?

szukam znaleźć czy dwie wartości są takie same w tablicy. Napisałem następujący kod:

function validatePassTimeFields(passtimes) { 
    var success = true; 
    var length = passtimes.length; 
    var hashMap = new Object(); 
    for (var j=0; j<length; j++) { 
     if(hashMap[passtimes[j].value]==1) { 
      success = false; 
      alert("Duplicate Found"); 
      break; 
     } 
     hashMap[passtimes[j].value]=1; 
    } 
    return success; 
} 

Jestem nowy JavaScript, więc próbowałem przy użyciu HashMap jak znaleźć, czy istnieje duplikat. Czy jest to najlepszy sposób na znalezienie duplikatu w JavaScript? czy mogę ją zoptymalizować?

+0

chcesz "znaleźć" duplikaty lub "wyeliminowanie" je? –

+1

Sprawdź, czy któreś z tych rozwiązań może pomóc: http://stackoverflow.com/questions/840781/easiest-way-to-find-duplicate-values-in-a-javascript-array – Chase

+0

@ JarrodRoberson Po prostu chcę je znaleźć. A jeśli jest tylko jeden z nich, to mi wystarczy. – sheidaei

Odpowiedz

1

Twoja funkcja jest już bardzo dobre, oprócz kwestii, że to działa tylko dla tablic z ciągów znaków lub cyfr. Aby uzyskać bardziej kłopotliwe podejście do opieki, również o obiektach zobacz this answer. Nie sądzę, aby miało to znaczenie dla Ciebie, ponieważ masz jawny i ograniczony przypadek użycia (sprawdzanie tożsamości za pomocą właściwości value).

Jednak niektóre punkty zrobiłbym inaczej:

  • Nie używaj success zmienną i break z pętli, ale po prostu return z całej funkcji.
  • Zamiast konstruktora new Object zazwyczaj skrót obiekt dosłowne {} służy
  • Zamiast ustawiania wartości w hashMap do 1 jeden może używać true; możesz również pominąć operatora ds. równości == i po prostu sprawdzić prawdziwość nieruchomości. Nawet użyłbym in operator.
function validatePassTimeFields(passtimes) { 
    var length = passtimes.length; 
    var hashMap = {}; 
    for (var j=0; j<length; j++) { 
     if (passtimes[j].value in hashMap) { 
      alert("Duplicate Found"); 
      return false; 
     } 
     hashMap[passtimes[j].value] = 1; 
    } 
    return true; 
} 
0

Wygląda na to, że nie chcesz znaleźć duplikatów, aby sprawdzić, czy są jakieś?

Jesteś blisko, oto funkcja robocza;

var hasDuplicates = function (arr) { 

    var _store = {}; 

    for (var i = 0; i < arr.length; i++) { 

     if (typeof _store["_" + arr[i]] !== "undefined") { 
      return true; 
     } 

     _store["_" + arr[i]] = true; 

    } 

    return false; 

}; 

Podkreślenia w tablicy asocjacyjnej są niezbędne do przechowywania wartości liczbowych. Funkcja hasDuplicates() działa tylko z obiektami, które mają metodę toString().

Aby sprawdzić duplikaty;

var yourArray = [1, 5, 7, 3, 5, 6]; 

if (hasDuplicates(yourArray)) {... 
+0

Świetne rozwiązanie. Jasne i proste. –

+1

Dlaczego używasz tylu podkreśleń? – Bergi

+0

@Bergi - W pewnym sensie "zaznaczam" zmienne jako prywatne dla zakresu. W ten sposób łatwiej jest nie mieszać ich ze zmiennymi w zewnętrznym zakresie. –

0

Warto sprawdzić wzmocnienie podkreślenia tej funkcji. Jeśli chcesz tylko wyeliminować duplikaty, możesz użyć _.uniq(), ale jeśli jesteś bardziej zainteresowany wiedzą, że istnieją duplikaty lub szczegóły czystych implementacji, możesz sprawdzić listę source of this method, która jest bardzo dobrze udokumentowana.

Wiem, że nie jest to bezpośrednia odpowiedź kodu na pytanie - jest ich już kilka, więc nie byłoby to przydatne do powtórzenia. Ale pomyślałem, że warto wspomnieć, że podkreślenie to świetna biblioteka narzędziowa, a źródło to świetne miejsce, aby dowiedzieć się więcej o dobrze napisanym javascript.

1

// będzie tylko trzeba ją zoptymalizować, jeśli chcesz go używać elsewhere-

function noduplicates(array){ 
    var next, O= {}, 
    L= array.length; 
    while(L){ 
     next= array[--L]; 
     if(O[next]) return false; 
     O[next]= 1; 
    } 
    return true; 
} 


function validatePassTimeFields(passtimes){ 
    if (noduplicates(passtimes)) return true; 

    alert("Duplicate Found"); 
    return false; 
} 
+0

Testuję twój kod http://jsfiddle.net/GubnU/ i działa dobrze. Jednakże, gdy uruchamiam go lokalnie, muszę zmienić linię, w której przypisujesz następną wartość do następującej: next = array [- L] .value; Każdy pomysł, dlaczego? – sheidaei

Powiązane problemy