2015-02-11 18 views
17

Was denken Sie alle wären die besten (am besten lesbarsten oder leistungsfähigsten, Ihre Wahl) Weg, eine Funktion mit den Lodash-Dienstprogramme zu schreiben, um zu überprüfen ein Array für doppelte Werte.Mit lodash überprüfen, ob ein Array doppelte Werte hat

Ich möchte ['foo', 'foo', 'bar'] eingeben und die Funktion true zurückgeben. Und geben Sie ['foo', 'bar', 'baz'] ein und haben Sie die Funktion false zurückgeben.

Antwort

31

können Sie diesen Code versuchen:

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

einen besonderen Grund für '==' 'vs ==='? – nackjicholson

+0

In diesem speziellen Fall spielt es keine Rolle. Ich wechselte zu '' '===' ''. Vielen Dank! – agershun

+1

Sicher, aber um wählerisch zu sein, bat das OP um eine 'hasDuplicates' Funktion, nicht' hasNoDuplicates'. –

2

Nun, es immer ist. lodashs _.uniq() Funktion. Diese Funktion gibt tatsächlich ein neues Array zurück, das nur eindeutige Werte enthält. Wenn Sie also nachsehen, ob sich die Länge des Arrays geändert hat, erhalten Sie Ihren "wahren" oder "falschen" Wert, um sich selbst zurückzugeben, glaube ich.

0

Ich weiß lodash nicht, aber ich einreichen:

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

Das Problem mit allen vorgeschlagenen Lösungen so weit ist, dass die gesamte Eingang Array-Signalverarbeitung benötigt eine Antwort zu bekommen, auch wenn die Antwort liegt auf der Hand aus die ersten 2 Elemente des Arrays.

5

Sie könnten überprüfen, dass sich im Array ein _.some Element befindet, das beim Suchen im Array nicht seine eigene Position zurückgibt. Mit anderen Worten, es gibt mindestens ein Element, das früher im Array eine Übereinstimmung aufweist.

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

Vielleicht ist dies schneller als die _.uniq Lösung, da es sofort das erste duplizierte Element zu identifizieren, ohne den gesamten einzigartige-ified Array zu berechnen ist.

Oder je nach Codierung Stil und der Wunsch nach Lesbarkeit, und wenn Sie wollen der Kürze halber ES6 Pfeil Funktionen verwenden:

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

große Verwendung von 'indexOf' !! – Hrishi

+0

Nit-Pick: 'indexOf' (O (n)) innerhalb eines' some' (O (n)) -> O (n2). – tokland

Verwandte Themen