2015-05-01 166 views
3

我有以下對象被返回。我通過從json文件中讀取並將結果存儲在一個新對象中來計算一個名稱列表。將對象轉換爲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

+0

對不起,它應該是名稱屬性。我糾正了。 – Myoji

回答

5

我不明白你的代碼示例如何涉及的問題,但是這變成了第一格式的數據進入最後格式:

var output = Object.keys(input).map(function(key) { 
    return { 
    name: key, 
    count: input[key] 
    } 
}); 

它使用函數式編程風格,這通常會導致清潔劑碼。

JSBin

+3

注意OP:請記住['Object.Keys()'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys)是ECMA 5.1,所以

+1

@BradChristie感謝您的兼容性說明。我更喜歡JSBin那裏沒有視覺輸出,或者當我認爲OP可能想要玩代碼時。 – joews

6

考慮這個以下的Javascript片段:

for (var item in obj) { 
    result.push({ 
     name: item, 
     total: obj[item] 
    }); 
} 

Working DEMO

輸出:

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

我更喜歡這個解決方案,因爲它不需要ECMA 5.1,但性能看起來與使用Object.keys()方法幾乎相同。我認爲這款產品是ECMA 3或更早版本(?)。 – Roberto