Jiv*_*van 7 javascript ecmascript-6
外部API返回以下形式的JSON结果:
{
"data": {
"1.0": 'foo',
"2.3": 'bar',
"3.6": 'baz'
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,键"1.0", "2.3", "3.6"实际上应该视为表示离散分类的字符串,而不是沿连续轴的值。因此,此API以字符串形式返回这些键是完全有效的。
但是...(您会感觉到它来了,不是吗?)
在JS客户端中,我需要遍历这些键,这会带来麻烦:
NumberObject.keys(myObject.data)return ...字符串!{
"data": {
"1.0": 'foo',
"2.3": 'bar',
"3.6": 'baz'
}
}
Run Code Online (Sandbox Code Playgroud)
看来我们这里有两个矛盾的地方:首先,对象键被转换为Numbers,但同时Object.keys()返回String而不是Numbers。
是否有解决此问题的适当方法?
理想情况下,我希望对象的实际键保持字符串不变。将值从中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])
}Run Code Online (Sandbox Code Playgroud)
根本不使用Object.keys:
let myObject = {
"data": {
"1.0": 'foo',
"2.3": 'bar',
"3.6": 'baz'
}
}
console.log(myObject.data)
for (let k in myObject.data) {
console.log(k, myObject.data[k])
}Run Code Online (Sandbox Code Playgroud)
一些解释:
Object.keys做到了它所说的-从传入的对象中提取密钥,并将其作为数组返回(在您的情况下为:)[ "1.0", "2.3", "3.6"]。因此,当您尝试使用进行遍历时for..in,实际上是遍历该结果数组,而不是实际的对象和key变量将从数组中接收相应项的索引(0for "1.0",1for "2.3"等)。那就是for..in 工作原理。如果您想遍历数组的值,则可以将其for..of 用作另一个选项。或者,就您而言,就像我上面提到的那样,请不要使用Object.keys。
| 归档时间: |
|
| 查看次数: |
101 次 |
| 最近记录: |