外部 API 返回以下形式的 JSON 结果:
{
"data": {
"1.0": 'foo',
"2.3": 'bar',
"3.6": 'baz'
}
}
在这里,键 "1.0"、"2.3"、"3.6"
应该真正被视为表示离散分类的字符串,而不是沿连续轴的值.因此,此 API 将这些键作为字符串返回是完全有效的。
但是......(你能感觉到它来了,不是吗?)
在 JS 客户端中,我需要遍历这些键,问题来了:
- 浏览器的 JS 引擎自动将所有这些键转换为
Number
- 使用
Object.keys(myObject.data)
返回……字符串! - 因此,如您所见,以下根本不起作用:
let myObject = {
"data": {
"1.0": 'foo',
"2.3": 'bar',
"3.6": 'baz'
}
}
console.log(myObject.data)
for (let k in Object.keys(myObject.data)) {
console.log(k, myObject.data[k])
}
// {
// 1.0: 'foo',
// 2.3: 'bar',
// 3.6: 'baz
// }
// "1.0" undefined
// "2.3" undefined
// "3.6" undefined
这里似乎有两件相互矛盾的事情:首先,对象键被转换为数字,但同时,Object.keys()
返回字符串而不是数字。
有没有合适的方法解决这个问题?
理想情况下,我希望对象的实际键保留字符串,因为它们应该是。将 Object.keys()
中的值转换为 Numbers 会导致非常麻烦的解决方法,因为 API 有时可以(并且确实)返回“真实”字符串作为键(例如 { "red": 'foo', "blue": 'bar'
.
最佳答案
你的问题是for in
for in 尝试访问由 Object.keys(obj.data)
创建的数组中的键,实际上是索引
let obj = {"data": {"1.0": 'foo',"2.3": 'bar',"3.6": 'baz'}}
Object.keys(obj.data).forEach(e=>{
console.log(typeof e)
})
//You can simply drop of Object.keys
for (let k in obj.data) {
console.log(k, obj.data[k])
}
关于JavaScript 将带有数字字符串的键转换为数字......但 Object.keys() 不会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55207023/