Ich muss Arrays finden, in denen alle Werte gleich sind. Was ist der schnellste Weg, dies zu tun? Soll ich es durchlaufen und nur Werte vergleichen?
['a', 'a', 'a', 'a'] // true
['a', 'a', 'b', 'a'] // false
javascript
jquery
Marvin3
quelle
quelle
a.join(',').split(a[0]).length === a.length + 1
Antworten:
Oder einzeilig:
Array.prototype.every (von MDN): Die
every()
Methode testet, ob alle Elemente im Array den von der bereitgestellten Funktion implementierten Test bestehen.quelle
const everythings_equal = array => array.every(thing => thing === array[0]);
some
anstelle vonevery
:arr.some( v => v !== arr[0] )
. Dies wird früh zurückkehren, wenn das erste Element als ungleich befunden wirdarr[0]
.every
kehrt auch früh zurück.Edit: Sei ein roter Ninja:
Ergebnisse:
Warnung:
Dies liegt daran, dass wir keinen initialValue übergeben . Vielleicht möchten Sie
array.length
zuerst überprüfen .quelle
false
s besteht! Beispiel: try [false, false, false] .reduce (Funktion (a, b) {return (a === b)? a: false;});["false", ""]
Rückkehrtrue
: /NaN
. Da beideNaN === NaN
undNaN !== NaN
falsch sind, wird garantiert, dassprev
kein Wert , sobald der auf NaN gesetzt ist, herausgenommen werden kann. Durch Hinzufügen einer doppelten Negation werden die Ergebnisse intrue
und konvertiertfalse
, da diesNaN
falsch ist. Endgültige Form:!!array.reduce(function(a, b){ return (a === b) ? a : NaN; });
Das funktioniert. Sie erstellen eine Methode für Array mithilfe eines Prototyps.
Nennen Sie dies so:
quelle
Array.prototype
Feinen (sogar IE6). Es sind nur DOM-Element-Prototypen, die von einigen älteren Versionen des IE nicht erweitert werden.allValuesSame
in der Schleife bekommenIn JavaScript 1.6 können Sie Folgendes verwenden
Array.every
:Sie benötigen wahrscheinlich einige Sicherheitsüberprüfungen, z. B. wenn das Array keine Elemente enthält. (Auch dies wird nicht funktionieren, wenn alle Elemente
NaN
seitdem vorhanden sindNaN !== NaN
, aber das sollte kein Problem sein ... richtig?)quelle
Sie können das Array in ein Set verwandeln. Wenn die Größe des Sets gleich 1 ist, sind alle Elemente des Arrays gleich.
quelle
allEqual([NaN, NaN])
gibttrue
in diesem Fall.Und zum Leistungsvergleich habe ich auch einen Benchmark gemacht:
Ergebnisse:
Die Verwendung von integriertem Array.some () ist anscheinend die schnellste der untersuchten Methoden.
quelle
Array#some
manchmal eine Outperformance erzielt wird, ist, dass die Rückruffunktion nicht mehr iteriert, sobald sie true zurückgibt. Wenn also tatsächlich alle Elemente gleich sind, sollte die Leistung identisch sein mitArray#every
. Und die relative Leistung, wenn nicht alle Elemente gleich sind, hängt vom Index des ersten nicht übereinstimmenden Elements ab.Kürzeste Antwort mit Unterstrich / lodash
spec:
bearbeiten:
Oder noch kürzer, inspiriert von Toms Antwort:
spec:
quelle
Wenn Sie bereits underscore.js verwenden , können Sie Folgendes verwenden
_.uniq
:_.uniq
Gibt eine duplikationsfreie Version des Arrays zurück. Wenn alle Werte gleich sind, beträgt die Länge 1.Wie in den Kommentaren erwähnt, sollten Sie angesichts der Tatsache, dass Sie möglicherweise erwarten, dass ein leeres Array zurückkehrt
true
, auch nach diesem Fall suchen:quelle
false
. Während ich denke, dass es sein solltetrue
. Ein Wechsel zu.length <= 1
soll jedoch ausreichen.Ja, Sie können es auch mit dem folgenden Filter überprüfen, ganz einfach, indem Sie überprüfen, ob alle Werte mit denen des ersten identisch sind:
kann auch mit jeder Methode auf dem Array durchgeführt werden:
und Sie können Ihre Arrays wie folgt überprüfen:
Oder Sie können es nativen Array-Funktionen in JavaScript hinzufügen, wenn Sie es häufig wiederverwenden:
und Sie können Ihre Arrays wie folgt überprüfen:
quelle
Sie können verwenden,
Array.every
wenn unterstützt:Der alternative Ansatz einer Schleife könnte so etwas wie sein
sort
Oder, wenn die Gegenstände wie die Frage sind, etwas Schmutziges wie:
Funktioniert auch.
quelle
equals = !array.some( (v,i,a) => v!==a[0] )
. Ansonsten prüfst du nur, ob irgendein Wert dem ersten entspricht, was natürlich immer wahr sein wird :)some
stattevery
wie im ersten Absatz erwähnt verwendet. :) Danke für den Fang!Mit den Pfeilfunktionen Array.prototype.every , Object.is und ES6 können Sie diesen Einzeiler dazu bringen , das zu tun, was Sie wollen :
quelle
Ich denke, der einfachste Weg, dies zu tun, besteht darin, eine Schleife zu erstellen, um jeden Wert mit dem nächsten zu vergleichen. Solange es einen Bruch in der "Kette" gibt, würde es false zurückgeben. Wenn das erste gleich dem zweiten, das zweite gleich dem dritten usw. ist, können wir schließen, dass alle Elemente des Arrays gleich sind.
Wenn Sie Array-Daten [] haben, können Sie Folgendes verwenden:
quelle
quelle
Neue Lösung aktualisieren: Index prüfen
Mit ES6 aktualisiert: Verwendung
list.every
ist der schnellste Weg:alte Version:
quelle
Sie können dies verwenden:
Die Funktion prüft zunächst, ob das Array leer ist. Wenn dies der Fall ist, sind die Werte gleich. Andernfalls wird das Array gefiltert und alle Elemente verwendet, die sich vom ersten unterscheiden. Wenn es keine solchen Werte gibt => enthält das Array nur gleiche Elemente, sonst nicht.
quelle
Die
_.isEqual(object, other)
Funktion von Underscore scheint für Arrays gut zu funktionieren. Die Reihenfolge der Elemente im Array spielt eine Rolle, wenn die Gleichheit überprüft wird. Siehe http://underscorejs.org/#isEqual .quelle
quelle
Es ist einfach. Erstellen Sie eine Funktion und übergeben Sie einen Parameter. Kopieren Sie in dieser Funktion den ersten Index in eine neue Variable. Erstellen Sie dann eine for-Schleife und durchlaufen Sie das Array. Erstellen Sie innerhalb einer Schleife eine while-Schleife mit einer Bedingung, die überprüft, ob die neu erstellte Variable allen Elementen in der Schleife entspricht. Wenn die gleiche Rückgabe nach Abschluss der for-Schleife true ist, wird innerhalb der while-Schleife false zurückgegeben.
quelle
Die akzeptierte Antwort funktionierte großartig, aber ich wollte ein kleines bisschen hinzufügen. Die Verwendung hat bei mir nicht funktioniert,
===
da ich Arrays von Arrays von Objekten verglichen habe. In meiner gesamten App habe ich jedoch das Fast-Deep-Equal- Paket verwendet, das ich sehr empfehlen kann. Damit sieht mein Code folgendermaßen aus:und meine Daten sehen so aus:
quelle
Und du bist fertig!
quelle
Jetzt können Sie Sets verwenden, um dies einfach zu tun.
quelle
Sie könnten eine for-Schleife verwenden:
quelle
Nun, das ist wirklich nicht sehr kompliziert. Ich habe den starken Verdacht, dass Sie es nicht einmal versucht haben. Sie wählen den ersten Wert aus, speichern ihn in der Variablen und vergleichen dann innerhalb einer
for
Schleife alle nachfolgenden Werte mit dem ersten.Ich habe absichtlich keinen Code geteilt. Finden Sie heraus
for
, wie Variablen verwendet und verglichen werden.quelle
Einfache einzeilige Lösung, vergleichen Sie sie einfach mit einem Array, das mit dem ersten Eintrag gefüllt ist.
quelle
Ein weiterer interessanter Weg, wenn Sie die ES6-Pfeilfunktionssyntax verwenden:
Und wenn Sie die Variable für Array (x) nicht wiederverwenden möchten:
IMO vorheriges Poster, das array.every (...) verwendet hat, hat die sauberste Lösung.
quelle
quelle
Dies könnte funktionieren. Sie können auch den Kommentar-Code verwenden, der auch mit dem angegebenen Szenario gut funktioniert.
quelle
Ein anderer Weg mit begrenzter Größe und organisierter Liste:
Array1 = [1,2,3]; Array2 = [1,2,3];
quelle
Sie können ein Array in ein Set konvertieren und dessen Größe überprüfen
Im Fall eines primitiven Feldeinträge, das heißt
number
,string
:Im Fall einer Anordnung von Objekten mit einem Feld, das auf Äquivalenz getestet werden soll, sagen Sie
id
:quelle
In PHP gibt es eine sehr einfache einzeilige Lösung:
(count (array_count_values ($ array)) == 1)
Zum Beispiel :
Das ist alles.
quelle