Ich habe mir die eingereichten Antworten angesehen und festgestellt, dass sie nur gelten, wenn Sie das Objekt über eine Referenz suchen. Eine einfache lineare Suche mit Referenzobjektvergleich.
Aber nehmen wir an, Sie haben keinen Verweis auf ein Objekt, wie finden Sie dann das richtige Objekt im Array? Sie müssen linear vorgehen und bei jedem Objekt einen Tiefenvergleich durchführen. Stellen Sie sich vor, die Liste ist zu groß, und die Objekte darin sind sehr groß und enthalten große Textstücke. Die Leistung nimmt mit der Anzahl und Größe der Elemente im Array drastisch ab.
Sie können Objekte stringifizieren und in die systemeigene Hash-Tabelle einfügen, aber dann haben Sie Datenredundanz, weil JavaScript diese Schlüssel für 'for i in obj' speichert, und Sie wollen nur prüfen, ob das Objekt existiert oder nicht, d.h. Sie haben den Schlüssel.
Ich habe einige Zeit darüber nachgedacht, einen JSON-Schema-Validator zu konstruieren, und ich habe einen einfachen Wrapper für die systemeigene Hash-Tabelle entwickelt, ähnlich der alleinigen Hash-Tabellen-Implementierung, mit einigen Optimierungsausnahmen, die ich der systemeigenen Hash-Tabelle überlasse. Es muss nur noch ein Leistungs-Benchmarking durchgeführt werden... Alle Details und der Code können in meinem Blog nachgelesen werden: http://stamat.wordpress.com/javascript-quickly-find-very-large-objects-in-a-large-array/ Ich werde in Kürze Benchmark-Ergebnisse veröffentlichen.
Die vollständige Lösung funktioniert folgendermaßen:
var a = {'a':1,
'b':{'c':[1,2,[3,45],4,5],
'd':{'q':1, 'b':{'q':1, 'b':8},'c':4},
'u':'lol'},
'e':2};
var b = {'a':1,
'b':{'c':[2,3,[1]],
'd':{'q':3,'b':{'b':3}}},
'e':2};
var c = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.";
var hc = new HashCache([{a:3, b:2, c:5}, {a:15, b:2, c:'foo'}]); //init
hc.put({a:1, b:1});
hc.put({b:1, a:1});
hc.put(true);
hc.put('true');
hc.put(a);
hc.put(c);
hc.put(d);
console.log(hc.exists('true'));
console.log(hc.exists(a));
console.log(hc.exists(c));
console.log(hc.exists({b:1, a:1}));
hc.remove(a);
console.log(hc.exists(c));
65 Stimmen
Gerade getestet: Ihr Weg ist tatsächlich der schnellste für alle Browser: jsperf.com/find-element-in-obj-vs-array/2 (abgesehen von der Vorabspeicherung von a.length in einer Variablen), während die Verwendung von indexOf (wie in $.inArray) viel langsamer ist
23 Stimmen
Viele haben geantwortet, dass die Array#indexOf ist Ihre beste Wahl hier. Aber wenn Sie etwas wollen, das korrekt in Boolean umgewandelt werden kann, verwenden Sie dies:
~[1,2,3].indexOf(4)
wird 0 zurückgeben, was als falsch ausgewertet wird, während~[1,2,3].indexOf(3)
wird -3 zurückgeben, was als wahr ausgewertet wird.13 Stimmen
~
ist nicht das, was Sie für die Konvertierung in einen Booleschen Wert verwenden wollen, dafür brauchen Sie!
. Aber in diesem Fall wollen Sie die Gleichheit mit -1 prüfen, damit die Funktion nicht endetreturn [1,2,3].indexOf(3) === -1;
~
nicht binär ist, wird jedes Bit des Wertes einzeln invertiert.1 Stimmen
IE9 unterstützt
indexOf()
gemäß w3schools.com/jsref/jsref_indexof_array.asp . Wenn ältere Browser besser Ansatz ist, zu definierenprototype
paraindexOf()
Funktion, wie sie in Array.indexOf im Internet Explorer19 Stimmen
@Iordvlad
[1,2,3].indexOf(4)
wird tatsächlich Rückgabe -1 . Wie @mcfedr feststellte,~
ist die bitweise-NOT-Operator siehe ES5 11.4.8. Da die binäre Darstellung von-1
nur aus 1en besteht, ist sein Komplement0
die als falsch ausgewertet wird. Das Komplement einer beliebigen anderen Zahl ist ungleich Null, also wahr. Also,~
funktioniert einwandfrei und wird häufig in Verbindung mitindexOf
.9 Stimmen
Der Titel ist irreführend. Wo ist die
[[1,2],[3,4]].includes([3,4])
?1 Stimmen
@brad, wenn ich zum ersten Mal lesen Sie Ihre Frage, ich konnte nicht verstehen, Ihre Idee, ein Objekt hier ist Javascript-Objekt oder ein primitiver Wert. Angenommen, ich habe ein Array:
const arr = [1, 2, 3, { foo: 1}];
. Undarr.includes(1) // true
sondernarr.includes({ foo: 1 }) //false
1 Stimmen
Wenn die Elemente in Ihrem Array Objekte sind dann schauen Sie sich este Antwort, die die
some
Funktion.0 Stimmen
let arr = ['apple','banana', 1, 2, 4] if (!arr.includes('banana') ) console.log('No') else console.log('Yes')
0 Stimmen
Console.log(['joe', 'jane', 'mary'].includes('jane'));