Внешний 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' }
.