Angenommen, ich habe ein assoziatives Javascript-Array (auch bekannt als Hash, auch bekannt als Dictionary):
var a = new Array();
a['b'] = 1;
a['z'] = 1;
a['a'] = 1;
Wie kann ich die Schlüssel in sortierter Reihenfolge durchlaufen? Wenn es hilft, die Dinge zu vereinfachen, brauche ich nicht einmal die Werte (sie sind alle nur die Nummer 1).
javascript
Mike
quelle
quelle
a = {};
.Antworten:
Sie können sie nicht direkt durchlaufen, aber Sie können alle Schlüssel finden und sie dann einfach sortieren.
Es ist jedoch nicht erforderlich, die Variable 'a' zu einem Array zu machen. Sie verwenden es wirklich nur als Objekt und sollten es folgendermaßen erstellen:
quelle
for
Schleife überprüfen , obobj.hasOwnProperty(key)
.Sie können die integrierte Methode Object.keys verwenden:
(Hinweis: Dies funktioniert nicht in sehr alten Browsern, die EcmaScript5 nicht unterstützen, insbesondere IE6, 7 und 8. Detaillierte aktuelle Statistiken finden Sie in dieser Tabelle. )
quelle
if (!Object.keys) { Object.keys = function (obj) { var op, result = []; for (op in obj) { if (obj.hasOwnProperty(op) { result.push(op) } } return result }
Sie könnten es sogar auf ein Objekt prototypisieren:
und die Verwendung:
quelle
key -> value
Beziehung beibehalten wird .Ich stimme Swingleys Antwort zu und ich denke, es ist ein wichtiger Punkt, dass viele dieser ausgefeilteren Lösungen fehlen. Wenn Sie sich nur mit den Schlüsseln im assoziativen Array befassen und alle Werte '1' sind, speichern Sie einfach die 'Schlüssel' als Werte in einem Array.
Anstatt:
Verwenden:
Der einzige Nachteil dabei ist, dass Sie nicht feststellen können, ob ein bestimmter Schlüssel so einfach eingestellt werden kann. In dieser Antwort auf die Javascript-Funktion inArray finden Sie eine Antwort auf dieses Problem. Ein Problem bei der vorgestellten Lösung ist, dass
a.hasValue('key')
sie etwas langsamer sein wird alsa['key']
. Das kann in Ihrem Code von Bedeutung sein oder auch nicht.quelle
Es gibt keine präzise Möglichkeit, die "Schlüssel" eines Javascript-Objekts direkt zu bearbeiten. Es ist nicht wirklich dafür ausgelegt. Haben Sie die Freiheit, Ihre Daten in etwas Besserem als einem normalen Objekt (oder einem Array, wie Ihr Beispielcode vorschlägt) abzulegen?
Wenn ja, und wenn Ihre Frage wie folgt umformuliert werden könnte: "Welches wörterbuchähnliche Objekt sollte ich verwenden, wenn ich die Schlüssel in sortierter Reihenfolge durchlaufen möchte?" dann könnten Sie ein Objekt wie dieses entwickeln:
Wenn Sie keine Kontrolle darüber haben, dass sich die Daten in einem regulären Objekt befinden, konvertiert dieses Dienstprogramm das reguläre Objekt in Ihr voll funktionsfähiges Wörterbuch:
Dies war der Einfachheit halber eine Objektdefinition (anstelle einer wiederverwendbaren Konstruktorfunktion); nach Belieben bearbeiten.
quelle
Holen Sie sich die Schlüssel in der ersten
for
Schleife, sortieren Sie sie, verwenden Sie das sortierte Ergebnis in der zweitenfor
Schleife.quelle
Sie können die
keys
Funktion aus der Bibliothek underscore.js verwenden, um die Schlüssel abzurufen, und dann diesort()
Array-Methode, um sie zu sortieren:Die
keys
Funktion im Quellcode des Unterstrichs:quelle
quelle
quelle
Ich mag die Prototypenidee von @ luke-schafer sehr, höre aber auch, was er über die Probleme mit Prototypen sagt. Was ist mit einer einfachen Funktion?
Dies scheint die Probleme mit Prototypen zu beseitigen und dennoch einen sortierten Iterator für Objekte bereitzustellen. Ich bin jedoch kein wirklicher JavaScript-Guru, daher würde ich gerne wissen, ob diese Lösung versteckte Fehler aufweist, die ich verpasst habe.
quelle