将对象转换为JSON数组?

3
我收到了以下返回的对象。我通过从json文件中读取并将结果存储在新对象中来统计名称列表中的名称数。
{
    ted: 501,
    jeff: 40,
    tony: 90
}

下面的函数创建了一个对象,其中属性名为名称,其值为计数。
function countNames(json){

    var count = {};

    for (var i = 0, j = json.length; i < j; i++) {

       if (count[json[i].name]) {
          count[json[i].name]++;
       }
       else {
          count[json[i].name] = 1;
       } 
    }  

    return count;
}

我需要创建一个对象数组,生成如下结果。
[
    {
        name: 'ted',
        total: 501
    },
    {
        name: 'jeff',
        total: 40
    }
    {
        name: 'tony',
        total: 90
    }           
]

我不确定实现这个目标的最佳方法和最有效的途径是什么。欢迎任何帮助。


4
什么是“city”?你是否可以将countNames的输出结果添加到一个数组中,而无需修改代码逻辑呢? - CodingIntrigue
抱歉,应该是name属性。我已经更正了。 - Myoji
2个回答

6
考虑以下这段 Javascript 代码片段:
for (var item in obj) {
    result.push({
        name: item,
        total: obj[item]
    });
}

演示版

输出:

[  
   {  
      "name":"ted",
      "total":501
   },
   {  
      "name":"jeff",
      "total":40
   },
   {  
      "name":"tony",
      "total":90
   }
]

我更喜欢这个解决方案,因为它不需要 ECMA 5.1,但是性能似乎与使用 Object.keys() 方法几乎相同。我认为 for-in 循环是 ECMA 3 或更早的版本(?)。 - Yogi

5
我不明白你的代码示例与问题有何关联,但是这将第一种格式的数据转换为最后一种格式:
var output = Object.keys(input).map(function(key) {
  return {
    name: key,
    count: input[key]
  }
});

它使用函数式编程风格,通常会导致更干净的代码。

JSBin


3
注意:OP需要记住Object.Keys()是ECMA 5.1版本的,因此旧版IE浏览器(IE9及以下版本)可能会出现问题。(虽然我认为for...in也有相同的限制):: 另外,@joews:现在SO有代码片段了,无需引用JSBin网站。 - Brad Christie
1
@BradChristie 感谢您的兼容性说明。我更喜欢JSBin,因为它没有可视化输出,或者当我认为OP可能想要玩弄代码时。 - joews

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接