Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript对象检查键——但忽略大小写_Javascript - Fatal编程技术网

JavaScript对象检查键——但忽略大小写

JavaScript对象检查键——但忽略大小写,javascript,Javascript,通常,我会这样做 if (key in obj) { //other stuff } 但我不知道它们的资本是一样的。最好的方法是什么?我不希望遍历整个数组,对对象中的每个键调用.toLowercase,但这是唯一的选项吗?长代码但更快 var key, keys = Object.keys(obj); var n = keys.length; var objArr=[] while (n--) { objArr.push(keys[n].toLowerCase()); } if

通常,我会这样做

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

但我不知道它们的资本是一样的。最好的方法是什么?我不希望遍历整个数组,对对象中的每个键调用
.toLowercase
,但这是唯一的选项吗?

长代码但更快

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
}

代码长但速度更快

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
}

您可能不知道密钥大小写是什么,因为您从第三方源获取对象,例如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

可能您不知道密钥大小写是什么,因为您从第三方源获取对象,例如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。

以下是您想要的:

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' ];
以下是您想要的:

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' ];


我想这并不总是安全的——一个对象中可以有一个密钥的多个版本(例如,
/
)。在这种情况下,简单的小写字母是不够的。你是对的,它并不总是安全的。幸运的是,数据集是这样“小心”的。您可以用
对象读取键。键
,然后将结果数组连接到字符串,并用RegExp测试键。@Teemu:有趣的解决方案,但如果我真的想从对象读取值,它会很麻烦,我想可能的重复并不总是安全的-一个对象中可以有一个密钥的多个版本(例如,
/
)。在这种情况下,简单的小写字母是不够的。你是对的,它并不总是安全的。幸运的是,数据集以这种方式是“小心”的。您可以使用
对象读取键。键
,然后将结果数组加入字符串,并使用RegExp测试键。@Teemu:有趣的解决方案,但如果我真的想从对象读取值,这会让人感到毛骨悚然,我以后会这样做。看起来代码更少了,但是如果(像我一样)键的大小远小于值的大小,那么效率可能会低很多。谢谢。我想我会用类似的东西,但是没有objTemp。因此,我只需要遍历键(使用
Object.keys(obj)
),只更改参数而不是对象的值。以更快的方式,我不会更改参数的值。它只是我正在转换为小写的密钥。如果它解决了你的问题,请考虑把它投票,并把它标记为正确答案。所以在我的问题中,我得到一个参数(我们将称之为代码>键< /COD>),因为我们喜欢混淆的变量名)和一个带有100个键/值对的对象。使用您的解决方案,我必须转换和存储100个密钥,以及存储对象中的所有其他内容。对于我打算使用的解决方案,我只需更改
,这就是我要存储/更改/复制的全部内容。对象(很大)不需要副本,而在您的对象中,它需要一个几乎相同的objTemp。这看起来代码更少,但如果(像我一样)键的大小远小于值的大小,效率可能会低很多。谢谢。我想我会用类似的东西,但是没有objTemp。因此,我只需要遍历键(使用
Object.keys(obj)
),只更改参数而不是对象的值。以更快的方式,我不会更改参数的值。它只是我正在转换为小写的密钥。如果它解决了你的问题,请考虑把它投票,并把它标记为正确答案。所以在我的问题中,我得到一个参数(我们将称之为代码>键< /COD>),因为我们喜欢混淆的变量名)和一个带有100个键/值对的对象。使用您的解决方案,我必须转换和存储100个密钥,以及存储对象中的所有其他内容。对于我打算使用的解决方案,我只需更改
,这就是我要存储/更改/复制的全部内容。对象(非常大)不需要副本,而在您的对象中,它需要一个几乎相同的objTemp。