我想在不区分大小写的对象中找到密钥。
对象非常大,所以我不能修改对象以使所有键都是小写/大写。
例如。
我有var _columns = {...}
现在我需要查找是否存在Id密钥。
目前我正在使用if else来解决这个问题。
if (this._columns['Id']) {
this._idColumnName = 'Id';
} else if (this._columns['id']) {
this._idColumnName = 'id';
} else if (this._columns['ID']) {
this._idColumnName = 'ID';
}
有没有办法在JavaScript中使用任何模式或任何其他方式来检查密钥的存在。
答案 0 :(得分:5)
function containsKey(object, key) {
return !!Object.keys(object).find(k => k.toLowerCase() === key.toLowerCase());
}
// example
let o = {
Id: "001"
};
console.log(containsKey(o, 'ID')); // prints true
console.log(containsKey(o, 'id')); // prints true
console.log(containsKey(o, 'Id')); // prints true

如果要返回属性名称而不是布尔值,请从返回的值中删除!!
。
function findKey(object, key) {
return Object.keys(object).find(k => k.toLowerCase() === key.toLowerCase());
}
答案 1 :(得分:0)
由于Array.prototype.find()
和Array.prototype.findIndex()
仍然有一些有限的支持(主要是在移动浏览器上),我不得不想出一个跨浏览器的解决方案,所以我最初写这个来检查是否存在findIndex()
函数:
function findObjKey(find, obj) {
var keys = Object.keys(obj);
if (typeof keys.findIndex === 'function') {
var f = keys.findIndex(function(e) {
if (this.toLowerCase() === e.toLowerCase()) { return true; }
}, find);
if (~f) { return keys[f]; }
} else {
for (var i = 0; i < keys.length; i++) {
if (find.toLowerCase() === keys[i].toLowerCase()) { return keys[i]; }
}
}
return false;
}
但是,我发现循环遍历每个键实际上比使用findIndex()
更快!
findIndex():0.258056640625ms
Object.keys循环:0.19384765625ms
所以,我提出这个应该适用于任何支持Object.keys
的浏览器,并且也适用于对象或数组:
function findKey(find, obj) {
if (obj.constructor === Object) { obj = Object.keys(obj); }
for (var i = 0; i < obj.length; i++) {
if (find.toLowerCase() === obj[i].toLowerCase()) { return obj[i]; }
}
return false;
}