哆啦的时光机
Object.entries()返回一个数组,其元素是与[key, value]直接找到的可枚举属性对相对应的数组object。属性的顺序与手动循环对象的属性值所给出的顺序相同。- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries#Description该Object.entries函数几乎返回您要求的确切输出,除了键是字符串而不是数字。const obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};console.log(Object.entries(obj));如果您需要键是数字,您可以将结果映射到具有回调函数的新数组,该函数用从中强制转换的数字替换每对中的键。const obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};const toNumericPairs = input => { const entries = Object.entries(input); return entries.map(entry => Object.assign(entry, { 0: +entry[0] }));}console.log(toNumericPairs(obj));我使用箭头函数和Object.assign上面示例中的映射回调,以便我可以通过利用Object.assign返回所分配对象的事实将其保留在一条指令中,并且单个指令箭头函数的返回值是指令的结果。这相当于:entry => { entry[0] = +entry[0]; return entry;}正如@TravisClarke在评论中所提到的,地图功能可以缩短为:entry => [ +entry[0], entry[1] ]但是,这将为每个键值对创建一个新数组,而不是修改现有数组,从而使创建的键值对数组的数量加倍。虽然原始条目数组仍可访问,但它及其条目不会被垃圾回收。现在,即使使用我们的就地方法仍然使用两个保存键值对的数组(输入和输出数组),数组的总数只会改变一个。输入和输出数组实际上并没有用数组填充,而是对数组的引用,这些引用在内存中占用的空间可以忽略不计。修改每个键值对就地产生的内存增长可忽略不计,但需要输入更多字符。为每个键值对创建一个新数组会导致所需的内存量翻倍,但需要输入少一些字符。您可以更进一步,通过就地修改条目数组而不是将其映射到新数组来完全消除增长:const obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};const toNumericPairs = input => { const entries = Object.entries(obj); entries.forEach(entry => entry[0] = +entry[0]); return entries;}console.log(toNumericPairs(obj));