不区分大小写地访问 JavaScript 属性?

新手上路,请多包涵

假设我有一个对象:

 var obj = {
  foo:"bar",
  fizz:"buzz"
};

我需要像这样动态访问该对象的属性:

 var objSetter = function(prop,val){
  obj[prop] = val;
}

那里没有问题,除了 prop 需要不区分大小写,以防将属性名称传递到函数中,例如 Foo 而不是 foo

那么如何不区分大小写地通过名称指向一个对象的属性呢?如果可能,我想避免迭代整个对象。

原文由 Matt Cashatt 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答

将 obj 的所有属性与 prop 进行比较。

 var objSetter = function(prop,val){
  prop = (prop + "").toLowerCase();
  for(var p in obj){
     if(obj.hasOwnProperty(p) && prop == (p+ "").toLowerCase()){
           obj[p] = val;
           break;
      }
   }
}

原文由 Anoop 发布,翻译遵循 CC BY-SA 3.0 许可协议

尝试这个:

 var myObject = { "mIxeDCaSEKeY": "value" };

var searchKey = 'mixedCaseKey';
var asLowercase = searchKey.toLowerCase();
myObject[Object.keys(myObject).find(key => key.toLowerCase() === asLowercase)];

您也可以已经提供小写的 searchKey。

如果你想要它作为一个功能:

 /**
  * @param {Object} object
  * @param {string} key
  * @return {any} value
 */
function getParameterCaseInsensitive(object, key) {
  const asLowercase = key.toLowerCase();
  return object[Object.keys(object)
    .find(k => k.toLowerCase() === asLowercase)
  ];
}

如果找不到密钥,那么它将像往常一样返回 undefined

如果您需要支持旧版浏览器,则可以使用 filter 代替:

 function getParameterCaseInsensitive(object, key) {
  const asLowercase = key.toLowercase();
  return object[Object.keys(object).filter(function(k) {
    return k.toLowerCase() === asLowercase;
  })[0]];
}

如果您需要更老的支持,我建议使用 Object.keys()Array.filter() 的 polyfill。


注意:如果您还想检查不可枚举的键,请使用 Object.getOwnPropertyNames() 而不是 Object.keys()

书呆子注意:这假设您的对象没有密钥 undefined (例如: const foo = {[undefined]: 'bar'}; )。那太奇怪了。

原文由 ShortFuse 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题