2016-02-05 8 views
5

Jest pewien obiekt, który mam, gdzie dokładny przypadek właściwości nie jest znany z wyprzedzeniem. Na przykład nazwą właściwości może być "AbC" lub "Abc" lub "abc", itp.Czy istnieje skuteczny sposób sprawdzania nazw obiektów JavaScript niewrażliwych na wielkość liter?

Ale wiem, że tylko jeden istnieje. To jest Wiem, że nie może być zarówno właściwość "AbC", a także właściwość "abc".

W nazwie właściwości jest rozróżniana wielkość liter. Więc jeśli jest przechowywany jako theObject.Abc i szukam theObject.abc, nie znajdę tej właściwości.

W moim obiekcie może być 1000 takich nieruchomości.

Byłoby to możliwe, ale nieefektywne, jeśli za każdym razem, gdy chciałbym wykonać odnośnik, porównałem małą wartość właściwości, którą chcę znaleźć z małymi literami nazw właściwości, jak poniżej:

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

Czy ktoś ma na to sprytniejszy sposób?

Z przyczyn, których wyjaśnienie zajmie zbyt dużo czasu, nie mogę po prostu odtworzyć obiektu i zmienić jego właściwości na małe litery. Zdaję sobie sprawę, czy było to możliwe, że mogłem po prostu bezpośrednio znaleźć:

theObject['inputValue'.toLowerCase()] 
Ale jak powiedziałem, nie mogę. Nazwy właściwości w theObject są tym, czym są i nie można ich zmienić. Pytając mnie, dlaczego byłaby ogromna dygresja od problemu. Proszę mi wierzyć, że theObject utknął z nazwami właściwości, które ma.

Czy ktoś zna skuteczny sposób sprawdzania nazw właściwości w zależności od wielkości liter w takiej sytuacji?

+0

Mogłabyś prawdopodobnie zoptymalizuje instrukcję if, porównując najpierw długość łańcuchów. Możesz także buforować mapę, jeśli się nie zmienia. Poza tym nie sądzę. –

+0

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

+0

Używa regex i pętli za pomocą klawiszy. http://stackoverflow.com/a/6223307/548568 – blessenm

Odpowiedz

3

Tak jak mówisz, nie sądzę, że chcesz zapętlić drogę Obiektu. I dla Ciebie, myślałem, że sposób, jest bardziej efektywny i łatwy, i nic nie zapętla.

zobaczmy na skrzypcach:

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

oto przykład:

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')) 

ja również uzyskać swój rozważyć o dużej danych have.I można również wykorzystać mój kod aby przetestować obiekt, który ma 500 własności, może on bezpośrednio zwrócić. Chociaż, gdy jest bardzo duży, może mieć problem z pamięcią, myślę, że to może dać ci pojęcie o rozwiązaniu problemu. t.

byś mogła pomóc :)

+0

To na pewno wygląda interesująco! Zastanawiam się, dlaczego otrzymuję komunikat "Object.getOwnPropertyNames nie jest funkcją", gdy próbuję go na moim serwerze. Poinformuję o tym ponownie po dokładniejszym zbadaniu sprawy! Dzięki. –

+0

To może mieć dwie możliwości. Jednym z nich jest twój JavaScript env to Jelly

3

Budowanie off przykład galaretka, ale być może bardziej skuteczne i łatwiejsze do zrozumienia:

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

Idąc jeszcze dalej niż 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

Jak to jest lepsze od mojego? (To jest autentyczne pytanie, nie jestem defensywny, wydaje mi się, że jest to trochę łatwiejsze do zrozumienia, ale jeśli kupujesz coś za to, to jest tego warte, ale nie mogę powiedzieć, co kupujesz.) – Sigfried

+0

To może być tylko osobistą preferencją, ale deklaruję zmienną tylko wtedy, gdy wymagane są wielokrotne odniesienia ("klucze" w kodzie odnoszą się tylko raz). Przyzwyczaiłem się do używania Object.keys, zwraca tylko klucze przeliczalne, twój kod będzie zawierał klucze nieprzeliczalne (co prawdopodobnie nie jest problemem, ale prawdopodobnie powinno być wspomniane). Metoda 'reduce' również sprawia, że ​​jest bardziej zrozumiały (dla mnie!), Że generujemy obiekt. – HBP

+0

Dzięki za opracowanie. Doceniam to. Szkoda, że ​​mój mózg przetwarzany nie zmniejsza się szybciej. Nie mogę ich odczytać bez poruszania wargami. :) – Sigfried

Powiązane problemy