Hier biete ich weitere Wege an, die in vielerlei Hinsicht schneller erscheinen:
Option 1: Zeichenkette aufteilen auf . oder [ oder ] oder ' oder ", umkehren, leere Elemente überspringen.
function getValue(path, origin) {
if (origin === void 0 || origin === null) origin = self ? self : this;
if (typeof path !== 'string') path = '' + path;
var parts = path.split(/\[|\]|\.|'|"/g).reverse(), name; // (why reverse? because it's usually faster to pop off the end of an array)
while (parts.length) { name=parts.pop(); if (name) origin=origin[name]; }
return origin;
}
Option 2 (am schnellsten von allen, außer eval
): Zeichen-Scan auf niedriger Ebene (kein Regex/Split/etc, nur ein schneller Zeichen-Scan). Hinweis: Dieses Programm unterstützt keine Anführungszeichen für Indizes.
function getValue(path, origin) {
if (origin === void 0 || origin === null) origin = self ? self : this;
if (typeof path !== 'string') path = '' + path;
var c = '', pc, i = 0, n = path.length, name = '';
if (n) while (i<=n) ((c = path[i++]) == '.' || c == '[' || c == ']' || c == void 0) ? (name?(origin = origin[name], name = ''):(pc=='.'||pc=='['||pc==']'&&c==']'?i=n+2:void 0),pc=c) : name += c;
if (i==n+2) throw "Invalid path: "+path;
return origin;
} // (around 1,000,000+/- ops/sec)
Option 3: ( neu Option 2: erweitert um die Unterstützung von Anführungszeichen - etwas langsamer, aber immer noch schnell)
function getValue(path, origin) {
if (origin === void 0 || origin === null) origin = self ? self : this;
if (typeof path !== 'string') path = '' + path;
var c, pc, i = 0, n = path.length, name = '', q;
while (i<=n)
((c = path[i++]) == '.' || c == '[' || c == ']' || c == "'" || c == '"' || c == void 0) ? (c==q&&path[i]==']'?q='':q?name+=c:name?(origin?origin=origin[name]:i=n+2,name='') : (pc=='['&&(c=='"'||c=="'")?q=c:pc=='.'||pc=='['||pc==']'&&c==']'||pc=='"'||pc=="'"?i=n+2:void 0), pc=c) : name += c;
if (i==n+2 || name) throw "Invalid path: "+path;
return origin;
}
JSPerf: http://jsperf.com/ways-to-dereference-a-delimited-property-string/3
"eval(...)" ist aber immer noch der König (zumindest was die Leistung angeht). Wenn Sie Eigenschaftspfade direkt unter Ihrer Kontrolle haben, sollte es keine Probleme mit der Verwendung von "eval" geben (insbesondere, wenn Geschwindigkeit gewünscht ist). Wenn Eigenschaftspfade "über den Draht" gezogen werden ( auf der Linie !? lol :P), dann ja, verwenden Sie etwas anderes, um sicher zu sein. Nur ein Idiot würde sagen, dass man "eval" überhaupt nicht verwenden sollte, da es SIND gute Gründe wann er zu verwenden ist. Außerdem: "Es wird verwendet in Doug Crockfords JSON-Parser ." Wenn die Eingabe sicher ist, dann gibt es keine Probleme. Verwenden Sie das richtige Werkzeug für die richtige Aufgabe, das ist alles.
0 Stimmen
Sie sind sich nicht sicher, was Sie hier fragen? Möchten Sie part1.name abfragen können und den Text "part1.name" zurückerhalten? Oder möchten Sie den in part1.name gespeicherten Wert abrufen?
0 Stimmen
Haben Sie versucht, etwas zu tun wie
var part1name = someObject.part1name;
`1 Stimmen
@BonyT : Ich möchte someObject.part1.name abfragen und den Wert davon zurückgeben ("Part 1"). Ich möchte jedoch, dass die Abfrage (ich nannte sie "den Schlüssel") in einer Variablen 'part1name' gespeichert wird. Vielen Dank für Ihre Antwort. @3nigma : Das habe ich sicherlich. Aber das ist nicht meine Absicht. Vielen Dank für die Antwort.
1 Stimmen
In der doppelten Antwort, ich liebe die Antwort von fyr stackoverflow.com/questions/8817394/
1 Stimmen
Siehe auch JavaScript-Zeichenfolge in Punktnotation in eine Objektreferenz umwandeln
0 Stimmen
Werfen Sie einen Blick auf JSONPath: github.com/jayway/JsonPath
0 Stimmen
Das funktioniert gut npmjs.com/package/objekt-pfad