JavaScript 将带有数字字符串的键转换为数字......但 Object.keys() 不会

标签 javascript ecmascript-6

外部 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/

相关文章:

javascript - ES6 const 用于在 JavaScript 中创建对象原型(prototype);这是一种模式吗?

javascript - 如何使用 babel 编译用 es6 编写的 React 文件?

ecmascript-6 - 已解决 promise 的默认返回值

javascript - Safari 中的日期对象

javascript - 如何在 jQuery 中将变量与 ' ' 连接起来

javascript - 从 javascript 中现有的对象克隆一个新对象

javascript - ReactJs:仅返回数组中的唯一值

javascript - Node.js Web 应用程序初始化期间的 readFileSync() 是一种糟糕的方法吗?

javascript - 覆盖数据的超时(JS)

javascript - Angular 一次请求页面上的三个部分