2015-02-11 7 views
17

Quale pensi che sia il migliore (il migliore può essere interpretato come più leggibile o più performante, a tua scelta) per scrivere una funzione usando le utilità di lodash per verificare una matrice per valori duplicati.Utilizzo di lodash per verificare se un array ha valori duplicati

Desidero immettere ['foo', 'foo', 'bar'] e restituire la funzione true. E immettere ['foo', 'bar', 'baz'] e restituire la funzione false.

risposta

31

Si può provare questo codice:

function hasDuplicates(a) { 
 
    return _.uniq(a).length !== a.length; 
 
} 
 

 
var a = [1,2,1,3,4,5]; 
 
var b = [1,2,3,4,5,6]; 
 

 
document.write(hasDuplicates(a), ',',hasDuplicates(b));
<script src="http://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.1.0/lodash.min.js"></script>

+0

Qualsiasi motivo particolare per '' == === vs ''? – nackjicholson

+0

Non importa in questo caso particolare. Ho cambiato in '' '===' ''. Grazie! – agershun

+1

Certo, ma per essere pignoli l'OP ha chiesto una funzione 'hasDuplicates', non' hasNoDuplicates'. –

2

Beh, c'è sempre. la funzione di lodash _.uniq(). Quella funzione restituisce in realtà un nuovo array che contiene solo valori univoci, quindi, controllando per vedere se la lunghezza dell'array è stata modificata, otterresti il ​​tuo valore "vero" o "falso" da restituirti, credo.

0

Non lo so, ma lodash presento:

_.any(_.countBy(['foo', 'foo', 'bar']), function(x){ return x > 1; }); 

Il problema con tutte le soluzioni proposte finora è che l'intero array di ingresso ha bisogno di elaborazione per ottenere una risposta, anche se la risposta è ovvia da i primi 2 elementi dell'array.

5

È possibile verificare che nell'array sia presente l'elemento _.some che non restituisce la propria posizione quando viene cercato nell'array. In altre parole, c'è almeno un elemento che ha una corrispondenza prima nell'array.

function hasDuplicates(array) { 
    return _.some(array, function(elt, index) { 
     return array.indexOf(elt) !== index; 
    }); 
} 

Forse questo è più veloce rispetto alla soluzione _.uniq, dal momento che identificherà il primo elemento duplicato subito senza dover calcolare l'intero array unico-ified.

Oppure, a seconda del vostro stile di codifica e il desiderio di leggibilità, e se si desidera utilizzare le funzioni di direzione ES6 per brevità:

var earlierMatch = (elt, index, array) => array.indexOf(elt) !== index; 
var hasDuplicates = array => _.some(array, earlierMatch); 
+0

ottimo uso di 'indexOf' !! – Hrishi

+0

Nit-pick: 'indexOf' (O (n)) all'interno di un' some' (O (n)) -> O (n2). – tokland

Problemi correlati