【问题标题】:Looping through javascript object converts keys to string [duplicate]循环通过javascript对象将键转换为字符串[重复]
【发布时间】:2015-11-10 14:16:47
【问题描述】:

当我在 Javascript 中遍历一个对象以提取其键时,为什么键在它们本来是整数时会转换为字符串?

obj = {1:'a', 2:'b'};
arr = [];
for(var key in obj){
  if (obj.hasOwnProperty(key)){
    arr.push(key);
  }
}

现在arr[ "1", "2" ] 而不是[1, 2]

【问题讨论】:

  • 不是你的问题,但如果你想要你的对象的键:在 JavaScript 的更新版本中,这可以直接使用 Object.keys()
  • @amenthes 我在某个地方看到过,但是我不确定浏览器是否支持这个 fn
  • 取决于您的用户群,但“最后两个”浏览器全面实施它。像这样的问题,我喜欢参考caniuse.com/#search=keys

标签: javascript


【解决方案1】:

转换键的不是循环;事实上,键只能是字符串。您不能拥有任何其他类型的密钥。如果您的键不是字符串,当您将其用作属性名称时,JavaScript 会将其转换为字符串。

考虑:

key = {
  toString: function () { return "Blah" }
};

myObject = {}

myObject[key] = "value";

// writes "Blah"
document.write(Object.keys(myObject));

请注意,如果您没有提供toString,则键将是字符串"[object Object]"

【讨论】:

【解决方案2】:

meagar 说的是正确的,但是如果出于某种原因您想要数字,您可以将它们转换为加号前缀;

obj = {1:'a', 2:'b'};
arr = [];
for(var key in obj){
  if (obj.hasOwnProperty(key)){
    arr.push(+key);
  }
}

console.log(arr)

也就是说,您可能有兴趣查看Object.keys method

【讨论】:

  • parseInt 怎么样? (显式和非 hacky)
  • @user4150760 当然,我展示了一种获取数字的方法,因为这正是 OP 所要求的;但最好的解决方案是 Object.keys()
  • 是的,甚至更短的箭头函数和array.map:const objectKeysAsInt = obj => {const keys = Object.keys(obj); return keys.map(key => parseInt(key))}
  • 甚至与他的问题无关。
猜你喜欢
  • 1970-01-01
  • 2020-11-15
  • 1970-01-01
  • 2018-01-26
  • 2019-11-04
  • 2013-09-03
  • 1970-01-01
  • 1970-01-01
  • 2020-01-25
相关资源
最近更新 更多