【问题标题】:JavaScript object check for key -- but ignore caseJavaScript 对象检查键——但忽略大小写
【发布时间】:2015-02-18 18:39:46
【问题描述】:

通常情况下,我会这样做

if (key in obj) {
    //other stuff
}

但我实际上并不知道它们的大小写相同。最好的方法是什么?我宁愿不遍历整个数组,在对象中的每个键上调用.toLowercase,但这是唯一的选择吗?

【问题讨论】:

  • 我想这并不总是安全的 - 您可以在一个对象中拥有多个版本的密钥(例如 value / Value)。在这种情况下,简单的小写是不够的。
  • 你说得对,它并不总是安全的。好在数据集是这样“小心”的。
  • 您可以使用Object.keys 读取密钥,然后将结果数组连接到字符串并使用RegExp 测试密钥。
  • @Teemu :有趣的解决方案,但如果我真的想从对象中读取值,它会变得很麻烦,我稍后会这样做。

标签: javascript


【解决方案1】:

长代码但速度更快

var key, keys = Object.keys(obj);
var n = keys.length;
var objArr=[]
while (n--) {
  objArr.push(keys[n].toLowerCase());
}

if (objArr.indexOf(key)!==-1) {
        //other stuff on obj
}

代码短,效率低

var objTemp = JSON.parse(JSON.stringify(obj).toLowerCase());

现在签到

if (key in objTemp) {
    //other stuff on obj
}

【讨论】:

  • 这看起来像更少的代码,但如果(像我一样)键的大小远小于值的大小,效率可能会低得多。
  • 谢谢。我想我会使用类似的东西,但没有 objTemp。所以我只是要遍历键(使用Object.keys(obj))并且只更改参数而不是对象的值。
  • 以更快的方式,我不会更改参数的值。它只是我正在转换为小写的关键。
  • 如果它解决了您的问题,请考虑投票并将其标记为正确答案。
  • 所以在我的问题中,我得到了一个参数(我们称它为key,因为我们喜欢混淆变量名)和一个对象,比如说 100 个键/值对。使用您的解决方案,我必须转换和存储 100 个键,以及将其他所有内容存储在对象中。使用我打算使用的解决方案,我只需要更改key,这就是我必须存储/更改/复制的全部内容。对象(很大)不需要副本,而在你的对象中它需要一个几乎相同的 objTemp。
【解决方案2】:

您可能不知道键大小写是什么,因为您从第 3 方来源获取对象,例如 AJAX 调用或其他脚本资源加载。您可以在此时插入规范化方法,并且每个对象只需循环一次,使其成为静态开销成本。

例如,定义一个方法

function normalizeObjectKeys(obj) {
  for (key in obj) {
    obj[key.toUpperCase()] = foo[key];
    delete obj[key];
  }
}

在我的 Chrome javascript 控制台中这样调用它似乎证明它有效。

> var foo = { bar: "bar", baZ: "baZ" }
undefined
> foo
Object {bar: "bar", baZ: "baZ"}
> normalizeObjectKeys(foo)
undefined
> foo
Object {BAR: "bar", BAZ: "baZ"}

然后您总是检查密钥的大写版本。它并不漂亮,如果同一键有不同的情况(例如foo = {bar : "bar", Bar : "baz" } 可能以BAR 的任一值结束),它会发生冲突,但它可能适合您的目的。如果你真的需要知道,你可以在设置值之前检查是否obj[key.toUpperCase] == undefined并记录错误或抛出异常。

【讨论】:

    【解决方案3】:

    这就是你想要的:

    function lowerCaseObjectKeys(object) {
      // clone the original object so that we don't modify its state
      const newObject = Object.assign({}, object);
    
      Object.keys(newObject).forEach((key) => {
        // if key is already lower-case, skip it & move on!
        if (key.toLowerCase() === key) {
          return;
        }
    
        // set a new, lower-cased key in newObject
        newObject[key.toLowerCase()] = newObject[key];
        // delete the original, non-lower-cased key (& value) from newObject
        delete newObject[key];
      });
    
      return newObject;
    }
    

    现在,您可以从对象中获取值,而不管键的大小写如何:

    lowerCaseObjectKeys( yourObjectHere )[ 'lowercasedkeyhere' ];
    

    【讨论】:

      猜你喜欢
      • 2017-07-12
      • 1970-01-01
      • 1970-01-01
      • 2018-01-11
      • 2012-12-08
      • 2012-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多