2015-12-15 72 views
0

我有一個javascript對象,如下所示,我試圖按項目分組。無法按javascript對象中的列表項進行分組

rfinOu=[ 
     { "pid": 34, "ava": 30 }, 
     { "pid": 45, "ava": 30 }, 
     { "pid": 32, "ava": 60 } 
     ] 

嘗試:

var res = {}; 
var avapro= d3.nest() 
.key(function (d) { return d.ava; }) 
.rollup(function (v) { return v.length }) 
//rollup(function (v) { return { count: v.length, pid: d3.sum(v, function (d) { return d.pid; }) }; }) 
.entries(rfinOu); 
res = JSON.stringify(avapro); 

我想有後的項目,如下面的分組輸出。但我無法......請幫助。

finOu=[ 
     { "ava": 30, "count":2, "Pids":{"pid":34,"pid":45}}, 
     { "ava": 60, "count":1, "Pids":{"pid":32}} 
       ] 
+0

所以你會希望創建一個新的對象,有着不同的價值觀,而不是現有的這些對象分組在一起。 – christopher

+0

是的。你是對的。 – sen

+0

你說你不能。向我們展示迄今爲止您嘗試的代碼,也許我們可以給您一些幫助,而不是爲您編寫整個代碼。 – Andy

回答

2

有一種替代。

var out = rfinOu.reduce(function (p, c) { 
    var key = c.ava; 
    p[key] = p[key] || { count: 0, pids: [] }; 
    p[key].count++; 
    p[key].pids.push(c.pid); 
    return p; 
}, {}); 

這將讓你的對象與ava鍵:

{ 
    "30": { "count": 2, "pids": [ 34, 45 ] }, 
    "60": { "count": 1, "pids": [ 32 ] }, 
} 

要獲得進入像在你的榜樣,只是環比對象鍵對象數組。

var arr = Object.keys(out).map(function(el) { 
    return { 
    ava: el, count: out[el].count, 
    pids: out[el].pids 
    } 
}); 

得到以下的輸出:

[ 
    { "ava": "30", "count": 2, "pids": [ 34, 45 ] }, 
    { "ava": "60", "count": 1, "pids": [ 32 ] }, 
] 

DEMO

+0

謝謝你,我會檢查所有的解決方案。非常感謝...增加了知識。 – sen

2

這裏有一個例子代碼用PIDS陣列,而不是一個對象:

var rfinOu=[ 
    { "pid": 34, "ava": 30 }, 
    { "pid": 45, "ava": 30 }, 
    { "pid": 32, "ava": 60 } 
]; 

var final = []; 
var indexes = {}; 
var position; 

rfinOu.forEach(function(item){ 

    if(indexes.hasOwnProperty(item.ava)){ 

    final[indexes[item.ava]].count++; 
    final[indexes[item.ava]].Pids.push(item.pid); 

    }else{ 

    position = final.length; 

    indexes[item.ava] = position; 

    final[position] = {ava: item.ava, count: 1}; 
    final[position].Pids = [item.pid]; 

    } 

}); 

console.log(final); 

jsfiddle

+0

它正在預期的工作。非常感謝... – sen

相關問題