2017-05-27 62 views
3

我有一個像對象:對象的多個資金有效d3.js

{ 
    [ 

     { id: "AL01", 
     list: [ 
        { speed : 5 
        value : 10} , 
        { speed : 7 
        value : 15} 
       ] 
    }, 
    { id: "AB01", 
     list: [ 
       { speed : 20 
        value : 1} , 
       { speed : 8 
        value : 10} 
       ] 
    } 

] 

} 

,我想有這樣的結果,如:

{[ { id: "AL01", speed: 12, value: 25}, { id: "AB01", speed: 28, value: 11}]} 

我怎麼能得到這個有效? 如果只能運行一次函數映射或forEach? 我想知道每件物品只有一次走過的東西。

回答

1

您需要一些更多的循環來獲得結果。

基本上是外部數組,然後迭代list並使用另一個數組作爲鍵。然後收集所有數據並返回一個新結構的新對象。

var array = [{ id: "AL01", list: [{ speed: 5, value: 10 }, { speed: 7, value: 15 }] }, { id: "AB01", list: [{ speed: 20, value: 1 }, { speed: 8, value: 10 }] }], 
 
    result = array.map(function (a) { 
 
     var temp = { id: a.id, speed: 0, value: 0 }; 
 
     a.list.forEach(function (b) { 
 
      ['speed', 'value'].forEach(function (k) { 
 
       temp[k] += b[k]; 
 
      }); 
 
     }); 
 
     return temp; 
 
    }); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

2

你的數據結構,是不正確的。您必須擁有數據對象中最外面數組的屬性。因此可以這樣做:

var data = {groups: [ {id: "AL01", list: [{ speed : 5, value : 10}, { speed : 7, value : 15}]}, {id: "AB01", list: [{ speed : 20, value : 1 }, { speed : 8, value : 10}]}]}, 
 
    result = {groups: data.groups.map(g => Object.assign({id: g.id},g.list.reduce((r,c) => ({speed : r.speed + c.speed, value : r.value + c.value}))))}; 
 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }