2012-10-04 16 views
8

Eventuali duplicati:
Easiest way to find duplicate values in a JavaScript arrayCome cercare attraverso un array in Javascript?

Sto cercando di trovare se due valori sono gli stessi in un array. Ho scritto il seguente codice:

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; 
} 

Sono nuovo di Javascript, così ho provato ad utilizzare HashMap piace trovare se c'è qualche duplicato. È il modo migliore per trovare un duplicato in JavaScript? o posso ottimizzarlo?

+0

vuoi "trovare" i duplicati o "eliminare" loro? –

+1

Verifica se una di queste soluzioni è utile: http://stackoverflow.com/questions/840781/easiest-way-to-find-duplicate-values-in-a-javascript-array – Chase

+0

@JarrodRoberson Voglio solo trovarle. E se ce n'è solo uno è abbastanza per me. – sheidaei

risposta

1

vostra funzione è già molto buona, a parte il problema che funziona solo per gli array con stringhe o numeri. Per un approccio più difficile da curare anche per gli oggetti vedi this answer. Non penso che ciò sia importante per te in quanto hai un caso d'uso esplicito e limitato (controllando l'identità con la proprietà value).

Tuttavia, alcuni punti mi piacerebbe fare diverso:

  • Non utilizzare la variabile success e break dal loop, ma proprio return dalla intera funzione.
  • Invece costruttore new Object solito l'oggetto collegamento letterale {} viene utilizzato
  • Invece di impostare i valori nel hashMap a 1 si potrebbe usare true; puoi anche omettere l'operatore di uguaglianza == e verificare la veridicità della proprietà. Anch'io userei lo 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

Sembra che tu non voglia trovare i duplicati, solo per vedere se ce ne sono?

Sei molto vicino, ecco una funzione funzionante;

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; 

}; 

I caratteri di sottolineatura nell'array associativo sono necessari per la memorizzazione di valori numerici. La funzione hasDuplicates() funziona solo su oggetti che hanno un metodo toString().

Per verificare la presenza di duplicati;

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

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

Ottima soluzione. Chiaro e semplice. –

+1

Perché usi così tanti caratteri di sottolineatura? – Bergi

+0

@Bergi - Io sono una specie di "marcatura" delle variabili come private per l'ambito. In questo modo è più facile non mescolarli con variabili nell'ambito esterno. –

0

Potrebbe valere la pena di verificare l'implementazione di underscore di questa funzionalità. Se stai solo cercando di eliminare i duplicati, puoi usare _.uniq(), ma se sei più interessato solo a sapere che ci sono dupes o i puri dettagli di implementazione, potresti divertirti a dare un'occhiata allo source of this method, che è molto ben documentato.

So che questa non è una risposta diretta al codice della domanda: ce ne sono già alcune, quindi non sarebbe utile ripeterle. Ma ho pensato che fosse degno di menzione in quanto underscore è una grande libreria di utilità e la fonte è un ottimo posto per saperne di più su javascript ben scritto.

1

// Si avrebbe solo bisogno di ottimizzarlo, se si desidera utilizzarlo 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

Sto testando il tuo codice http://jsfiddle.net/GubnU/ e funziona perfettamente. Tuttavia, quando lo eseguo localmente, devo cambiare la linea in cui assegni il seguente valore al seguente: next = array [- L] .value; Qualche idea del perché? – sheidaei

Problemi correlati