使用ignorecase在对象中查找键

时间:2017-02-22 05:55:18

标签: javascript

我想在不区分大小写的对象中找到密钥。

对象非常大,所以我不能修改对象以使所有键都是小写/大写。

例如。

我有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中使用任何模式或任何其他方式来检查密钥的存在。

2 个答案:

答案 0 :(得分:5)

使用Array.prototype.find()



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;
}