2016-02-05 5 views
5

Es gibt ein bestimmtes Objekt, das ich habe, wo der genaue Fall der Eigenschaften nicht vorher bekannt ist. Ein Eigenschaftenname könnte beispielsweise "AbC" oder "Abc" oder "abc" usw. sein.Gibt es eine effiziente Möglichkeit, eine JavaScript-Objekteigenschaftsnamensuche nach Groß- und Kleinschreibung durchzuführen?

Ich weiß jedoch, dass nur einer existiert. Das ist ich weiß, dass es sowohl eine Eigenschaft "AbC" und auch eine Eigenschaft "abc" sein kann.

Der Eigenschaftsname selbst unterscheidet zwischen Groß- und Kleinschreibung. Also, wenn es als TheObject.Abc gespeichert ist und ich nach TheObject.abc suche, finde ich die Eigenschaft nicht.

In meinem Objekt könnte es 1000 solcher Eigenschaften geben.

Es wäre möglich, aber ineffizient, wenn jedes Mal, wenn ich wollte einen Nachschlag ich den Klein Wert der Immobilie im Vergleich zu tun, ich habe gegen den Klein Wert der Eigenschaftsnamen finden möchten, wie folgt aus:

propertyName = inputValue.toLowerCase(); 
for (var i in theObject) { 
    if (propertyName == i.toLowerCase()); // found a matching property name 
} 

Kennt jemand eine klügere Art, dies zu tun?

Aus Gründen, die zu lange dauern würden, kann ich das Objekt nicht einfach neu erstellen und alle Eigenschaften in Kleinbuchstaben umwandeln. Ich weiß, wenn das möglich war, konnte ich nur

theObject['inputValue'.toLowerCase()] 

direkt finden. Aber wie gesagt, ich kann nicht. Die Eigenschaftennamen im Objekt sind wie sie sind und sie können nicht geändert werden. Fragt mich, warum wäre eine große Abschweifung von dem Problem zur Hand. Bitte nehmen Sie mein Wort dafür, dass TheObject mit den Eigenschaftsnamen fest ist, die es hat.

Kennt jemand eine effiziente Möglichkeit, eine Suche nach Groß-/Kleinschreibung in einem solchen Fall durchzuführen?

+0

Sie könnten optimiere wahrscheinlich die if-Anweisung, indem ich zuerst die Länge der Strings vergleiche. Sie können eine Karte auch zwischenspeichern, wenn sie sich nicht ändert. Ansonsten denke ich nicht. –

+0

'propertyName = inputValue.toLowerCase(); if (Object.keys (das Objekt).map (function (v) {return v.toLowerCase();}). indexOf (propertyName)> - 1) {// .....} ' –

+0

Dies verwendet Regex und führt Schleifen durch die Schlüssel. http://stackoverflow.com/a/6223307/548568 – blessenm

Antwort

3

Wie Sie sagen, ich glaube nicht, dass Sie die Schleife der Objekt Weg wollen.Und für Ihre Meinung, dachte ich einen Weg, das ist effektiver und einfacher, und es nichts schleifen.

sie die Geige sehen:

https://fiddle.jshell.net/skgkLnx9/

hier ist das Beispiel:

var theObject = {aBc: 1, BBA: 2, CCCa: 4, Dba: 3}; 
// if your env is < ES5, you can use a polyfill(like underscore or lodash provided `_.keys` method) 
var theKeys = Object.getOwnPropertyNames(theObject).toString(); 
// or var theKeys = Object.keys(theObject); 

var getPropValue = function(prop){ 
    var match = new RegExp(prop, 'i').exec(theKeys); 
    return match && match.length > 0 ? theObject[match[0]] : ''; 
} 

console.log(getPropValue('abc')) 

console.log(getPropValue('Dba')) 

ich auch Ihre betrachten über die großen Daten erhalten Sie auch meinen Code verwenden have.I um ein Objekt zu testen, das 500 Eigenschaft hat, kann es direkt zurückkehren. Obwohl, wenn es sehr sehr groß ist, kann es ein Gedächtnisproblem geben, ich denke, das kann Ihnen eine Idee über die Lösung tha geben t.

Wunsch könnte Ihnen helfen :)

+0

Das sieht sicherlich interessant aus! Ich frage mich, warum ich einen Fehler "Object.getOwnPropertyNames ist keine Funktion" bekomme, wenn ich es auf meinem Server versuche. Ich werde nach mehr Nachforschungen erneut berichten! Vielen Dank. –

+0

Dies kann zwei Möglichkeiten haben. Eine ist Ihre Javascript-Env ist Jelly

3

Jelly Beispiel Gebäude weg, aber vielleicht effizienter oder einfacher zu verstehen:

var theObject = {aBc: 1, BBA: 2, CCCa: 4, Dba: 3}; 
var theKeys = Object.getOwnPropertyNames(theObject); 
var lookup = {}; 
theKeys.forEach(function(key) { 
    lookup[key.toLowerCase()] = key; 
}); 

var getPropValue = function(prop){ 
    return lookup[prop.toLowerCase()]; 
} 
console.log(getPropValue('abc')) 
console.log(getPropValue('Dba')) 
3

Und geht noch weiter als Sigfried:

var theObject = {aBc: 1, BBA: 2, CCCa: 4, Dba: 3}; 

var lcKeys = Object.keys (theObject).reduce (
          function (keys, k) { keys[k.toLowerCase()] = k; 
               return keys }, {}); 

function getValue (key) { return theObject[lcKeys[key.toLowerCase()]] } 

console.log (getValue ('abc')); 
console.log (getValue ('Dba')); 
+1

Wie ist es eine Verbesserung für meine? (Dies ist eine echte Frage, ich bin nicht defensiv. Es scheint ein bisschen weniger leicht zu verstehen, aber wenn Sie etwas dafür kaufen, ist es das wert, aber ich kann nicht sagen, was Sie kaufen.) – Sigfried

+0

Es mag nur eine persönliche Vorliebe sein, aber ich deklariere nur dann eine Variable, wenn mehrere Referenzen erforderlich sind ('theKeys' in Ihrem Code wird nur einmal referenziert). Ich habe mich an die Verwendung von Object.keys gewöhnt, es gibt nur aufzählbare Schlüssel zurück, Ihr Code enthält nicht aufzählbare Schlüssel (was wahrscheinlich kein Problem ist, aber wahrscheinlich erwähnt werden sollte). Die "reduce" -Methode macht es auch (für mich) klarer, dass wir ein Objekt erzeugen. – HBP

+0

Danke für die Ausarbeitung. Ich schätze es. Ich wünsche mir, dass mein Gehirn schneller reduziert wird. Ich kann sie nicht lesen, ohne meine Lippen zu bewegen. :) – Sigfried

Verwandte Themen