在对象中查找忽略大小写的键名

3

我希望能够不区分大小写地查找对象中的键。

对象非常大,因此我无法修改对象以使所有键都变成小写/大写。

例如。

我有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中,有没有一种通过模式或其他方式来检查关键字是否存在的方法?


@Pavan Tiwari,下次请同时分享一下你尝试过的内容,包括代码或者你找到的参考链接。 - Rajesh
1
如果对象同时具有键 idID,该怎么办? - nnnnnn
2个回答

8

使用 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());
}

这是一个很好的解决方案。问题的措辞有点不清楚,但从 OP 的代码中可以看出,他们可能想返回属性名称而不是布尔值——如果是这样,显然这只需要对您的代码进行微小的调整即可。 - nnnnnn
@nnnnnn 谢谢。我更新了我的答案。 - Robby Cornelissen

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.258056640625毫秒

Object.keys循环: 0.19384765625毫秒

因此,我想出了这个方法,它适用于任何支持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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接