【问题标题】:Find key in object with ignorecase [duplicate]使用忽略大小写查找对象中的键[重复]
【发布时间】:2017-07-12 01:03:30
【问题描述】:

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

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

例如。

我有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';
}

S 有没有办法通过在 JavaScript 中使用任何模式或任何其他方式来检查密钥是否存在。

【问题讨论】:

  • @Pavan Tiwari,下次也请分享一下你的尝试? (您找到的代码或参考链接
  • 如果对象有键id ID怎么办?

标签: javascript


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    使用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 谢谢。更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 2012-09-11
    • 1970-01-01
    • 2014-12-23
    相关资源
    最近更新 更多