假设我有一个对象:
var obj = {
foo:"bar",
fizz:"buzz"
};
我需要像这样动态访问该对象的属性:
var objSetter = function(prop,val){
obj[prop] = val;
}
没有问题,除了prop
需要不区分大小写,以防将属性名称传递给函数,例如,Foo
而不是foo
.
那么如何在不考虑大小写的情况下按名称指向对象的属性呢?如果可能,我想避免迭代整个对象。
假设我有一个对象:
var obj = {
foo:"bar",
fizz:"buzz"
};
我需要像这样动态访问该对象的属性:
var objSetter = function(prop,val){
obj[prop] = val;
}
没有问题,除了prop
需要不区分大小写,以防将属性名称传递给函数,例如,Foo
而不是foo
.
那么如何在不考虑大小写的情况下按名称指向对象的属性呢?如果可能,我想避免迭代整个对象。
试试这个:
var myObject = { "mIxeDCaSEKeY": "value" };
var searchKey = 'mixedCaseKey';
myObject[Object.keys(myObject).find(key => key.toLowerCase() === searchKey.toLowerCase())];
您也可以提供小写的 searchKey。
如果你想把它作为一个函数:
/**
* @param {Object} object
* @param {string} key
* @return {any} value
*/
function getParameterCaseInsensitive(object, key) {
return object[Object.keys(object)
.find(k => k.toLowerCase() === key.toLowerCase())
];
}
如果找不到对象,则它会像平常一样返回 undefined。
如果您需要支持较旧的浏览器,则可以filter
改用:
function getParameterCaseInsensitive(object, key) {
return object[Object.keys(object).filter(function(k) {
return k.toLowerCase() === key.toLowerCase();
})[0]];
}
如果您需要更旧的支持,我建议使用用于Object.keys()和Array.filter() 的 polyfill。
将 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;
}
}
}
为此,我更喜欢使用原型而不是独立函数,只是为了便于使用和表达。如果没有必要,我只是不喜欢将对象汇集到函数中。
此外,虽然接受的答案有效,但我想要一个更全面的获取和设置解决方案,它的行为尽可能像本地点表示法或括号表示法。
考虑到这一点,我创建了几个原型函数来设置/获取对象属性而不考虑大小写。在添加到对象原型时,您必须记住要非常负责。特别是在使用 JQuery 和其他库时。将 enumerable 设置为 false 的 Object.defineProperty() 专门用于避免与 JQuery 发生冲突。我也没有费心为函数命名任何表明它们不区分大小写的东西,但你当然可以。我喜欢较短的名字。
这是吸气剂:
Object.defineProperty(Object.prototype, "getProp", {
value: function (prop) {
var key,self = this;
for (key in self) {
if (key.toLowerCase() == prop.toLowerCase()) {
return self[key];
}
}
},
//this keeps jquery happy
enumerable: false
});
这是二传手:
Object.defineProperty(Object.prototype, "setProp", {
value: function (prop, val) {
var key,self = this;
var found = false;
if (Object.keys(self).length > 0) {
for (key in self) {
if (key.toLowerCase() == prop.toLowerCase()) {
//set existing property
found = true;
self[key] = val;
break;
}
}
}
if (!found) {
//if the property was not found, create it
self[prop] = val;
}
return val;
},
//this keeps jquery happy
enumerable: false
});
现在我们已经创建了这些函数,我们的代码非常干净简洁并且可以正常工作。
不区分大小写的获取:
var obj = {foo: 'bar', camelCase: 'humpy'}
obj.getProp("FOO"); //returns 'bar'
obj.getProp("fOO"); //returns 'bar'
obj.getProp("CAMELCASE"); //returns 'humpy'
obj.getProp("CamelCase"); //returns 'humpy'
不区分大小写的设置:
var obj = {foo: 'bar', camelCase: 'humpy'}
obj.setProp('CAmelCasE', 'super humpy'); //sets prop 'camelCase' to 'super humpy'
obj.setProp('newProp', 'newval'); //creates prop 'newProp' and sets val to 'newval'
obj.setProp('NewProp', 'anotherval'); //sets prop 'newProp' to 'anotherval'
已经提出的另一种变体将迭代推入 Underscore/LodashfindKey
函数:
var _ = require('underscore');
var getProp = function (obj, name) {
var realName = _.findKey(obj, function (value, key) {
return key.toLowerCase() === name.toLowerCase();
});
return obj[realName];
};
例如:
var obj = { aa: 1, bB: 2, Cc: 3, DD: 4 };
getProp(obj, 'aa'); // 1
getProp(obj, 'AA'); // 1
getProp(obj, 'bb'); // 2
getProp(obj, 'BB'); // 2
getProp(obj, 'cc'); // 3
getProp(obj, 'CC'); // 3
getProp(obj, 'dd'); // 4
getProp(obj, 'DD'); // 4
getProp(obj, 'EE'); // undefined
您可以这样做以“正常化” prop
var normalizedProp = prop.toLowerCase();
obj[normalizedProp] = val;