有没有一种有效的方法来进行不区分大小写的JavaScript对象属性名称查找?

Dou*_*ner 11 javascript dictionary case-insensitive

我有一个特定的对象,其中属性的确切情况未提前知道.例如,属性名称可能是"AbC"或"Abc"或"abc"等.

但是,我知道只有一个存在.这是我知道不可能有两个属性"ABC",也是一个属性"ABC".

属性名称本身区分大小写.因此,如果它存储为Object.Abc并且我查找了Object.abc,我将找不到该属性.

在我的对象中可能有1,000个这样的属性.

如果每次我想进行查找,我会想要找到的属性的小写值与属性名称的小写值进行比较,这样可能,但效率很低,如下所示:

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

有人知道更聪明的做法吗?

由于理由需要很长时间来解释,我不能只重新创建对象并使所有属性都是小写的.我确实知道如果可能的话我可以找到

theObject['inputValue'.toLowerCase()]
Run Code Online (Sandbox Code Playgroud)

直.但正如我所说,我不能.对象中的属性名称是它们的属性,并且无法更改它们.问我为什么会出现手头问题的巨大偏离.请接受我的说法,即对象被它拥有的属性名称所困.

有没有人知道在这种情况下进行不区分大小写的属性名称查找的有效方法?

Sig*_*ied 5

以 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'))
Run Code Online (Sandbox Code Playgroud)


HBP*_*HBP 5

甚至比西格弗里德更进一步:

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'));
Run Code Online (Sandbox Code Playgroud)

  • 别客气。我曾经是一样的,但熟能生巧 ;) 我不时提出这些问题的一个原因 - 展示选项是什么。 (2认同)

Jel*_*lly 3

正如你所说,我不认为你想要以对象方式循环。就你的观点而言,我想到了一种方法,它更有效、更简单,而且它不循环任何东西。

让我们看看小提琴:

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'))
Run Code Online (Sandbox Code Playgroud)

我也得到你对你拥有的大数据的考虑。我还使用我的代码来测试一个具有 500 个属性的对象,它可以直接返回。虽然当它非常非常大时,可能会出现一些内存问题,我认为这可以给你一个关于解决这个问题的想法。

希望可以帮助你:)