web-dev-qa-db-ja.com

大文字と小文字を区別しないJavaScriptオブジェクトのプロパティ名を検索する効率的な方法はありますか?

プロパティの正確なケースが事前にわからないという特定のオブジェクトがあります。たとえば、プロパティ名は「AbC」、「Abc」、「abc」などです。

しかし、私は1つしか存在しないことを知っています。つまり、両方プロパティ "AbC"とプロパティ "abc"は存在できないことを私は知っています。

プロパティ名自体では大文字と小文字が区別されます。したがって、それがtheObject.Abcとして保存されていて、theObject.abcを検索すると、プロパティが見つかりません。

私のオブジェクトには、1,000のそのようなプロパティがあるかもしれません。

ルックアップを実行するたびに、検索するプロパティの小文字の値をプロパティ名の小文字の値と比較すると、次のようになりますが、非効率的です。

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

誰かがこれを行うための賢い方法を知っていますか?

説明に時間がかかりすぎるため、オブジェクトを再作成してすべてのプロパティを小文字にすることはできません。それが可能なら私はただ見つけることができたと思います

theObject['inputValue'.toLowerCase()]

直接。しかし、私が言ったように、私はできません。オブジェクト内のプロパティ名はそれらが何であるかであり、変更することはできません。なぜ目前の問題からの大きな余談になるのかと私に尋ねます。 theObjectがそれが持っているプロパティ名で立ち往生していることを私の言葉で理解してください。

このような状況で大文字と小文字を区別しないプロパティ名ルックアップを実行する効率的な方法を知っている人はいますか?

13
Doug Lerner

そして、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'));
5
HBP

あなたが言うように、私はあなたがオブジェクトの方法でループしたいとは思わない。そしてあなたの意見では、私はそれがより効果的で簡単で、何もループしない方法を考えた。

フィドルを見てみましょう:

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

ここに例があります:

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

また、あなたが持っている大きなデータについても考慮します。また、コードを使用して、直接返すことができる500プロパティを持つオブジェクトをテストします。非常に大きい場合は、メモリの問題が発生する可能性がありますが、これで問題が発生する可能性がありますそれを解決することについての考え。

願いはあなたを助けることができます:)

3
Jelly

Jellyの例を基に構築しますが、おそらくより効率的または理解しやすいでしょう。

 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
Sigfried