2016-06-27 11 views
1

私はこのようなjsonオブジェクトを持っています。 このjsonオブジェクトは、共通のProductという名前を持つことができます。たとえば、orgs[0] & orgs[3]の製品名は同じです。共通キーが1つの場合、json配列キーの値を合計する方法

"orgs": 
    [{ 
    "Budget Actual Consumption": "12.00", 
    "Budget Planned Consumption": "50.00", 
    "Product": "Loyalty CO-brand" 

}, { 
    "Budget Actual Consumption": "11.00", 
    "Budget Planned Consumption": "60.00", 
    "Product": "Loaylty Rebates" 
}, { 
    "Budget Actual Consumption": "10.00", 
    "Budget Planned Consumption": "7.00", 
    "Product": "Loaylty Rebates" 
}, { 

    "Budget Actual Consumption": "9.00", 
    "Budget Planned Consumption": "8.00", 
    "Product": "Loyalty CO-brand" 
}] 

それが&他のキーをユニークな製品名を持っているそれぞれのユニークな複数のオブジェクトを例

var someArray = [{ 
    name:"Loyalty CO-brand", 
    bac:"21" //12+9 
    pac:"58" //50+8 
},{ 
    name:"Loaylty Rebates", 
    bac:"21" //10+11 
    pac:"67" //60+7 

}] 
について

をまとめることになる必要がありますように新しい配列を作成することが可能です

一意の配列Productを作成してから、もう一度forEachを2回使用してみました。しかし、私はそれを完了することができませんでした私はどのように一致するときに他のキーの値を追加するかわからないのでProducts

+1

あなたは、文字列内の数字の後ろにスペースが必要なのでしょうか? –

+0

いいえ、私はそれらのスペースを必要としません、私はそれを編集しました – brk

+0

あなたのコードを表示し、それで動作しないもの – rafaelcastrocouto

答えて

3

結果がProductでグループ化されると仮定すると、オブジェクトをハッシュテーブル結果配列のオブジェクトに対して

数値の代わりに文字列を取得する必要がない場合、アルゴリズムは短くなります。

var data = { "orgs": [{ "Budget Actual Consumption": "12.00 ", "Budget Planned Consumption": "50.00 ", "Product": "Loyalty CO-brand" }, { "Budget Actual Consumption": "11.00 ", "Budget Planned Consumption": "60.00 ", "Product": "Loaylty Rebates" }, { "Budget Actual Consumption": "10.00 ", "Budget Planned Consumption": "7.00 ", "Product": "Loaylty Rebates" }, { "Budget Actual Consumption": "9.00 ", "Budget Planned Consumption": "8.00 ", "Product": "Loyalty CO-brand" }] }, 
 
    grouped = []; 
 

 
data.orgs.forEach(function (a) { 
 
    if (!this[a.Product]) { 
 
     this[a.Product] = { name: a.Product, bac: '0', pac: '0' }; 
 
     grouped.push(this[a.Product]); 
 
    } 
 
    this[a.Product].bac = (+this[a.Product].bac + +a['Budget Actual Consumption']).toString(); 
 
    this[a.Product].pac = (+this[a.Product].bac + +a['Budget Planned Consumption']).toString(); 
 

 
}, Object.create(null)); 
 

 
console.log(grouped);

+0

2つの値の前に '+ 'ビットを置きます(' + this [a.Product] .bac + + [[Budget Actual Consumption'] ')doこれらの行に?ありがとう。 –

+0

番号に型キャストします。 –

+1

ありがとうございます。ここでそれについてもっと読む:http://stackoverflow.com/questions/12120802/explain-var-and-var-unary-operator-in-javascript –

2

私は0123を使用してUnderscore groupBy

http://codepen.io/therealplato/pen/KMWPPN

//foo = {"orgs":[...]} 
console.log(foo); 
grouped = _.groupBy(foo.orgs, grouper); 
console.log(grouped); 
function grouper(item) { 
    return item["Product"]; 
} 

example output of _groupBy

+0

タイプごとに1つの配列があるので、次に、_map()を使用してその特定のタイプの統計を計算します – Plato

2

溶液で素敵な解決策を見つけました機能:

var org = { "orgs": [{ "Budget Actual Consumption": "12.00 ", "Budget Planned Consumption": "50.00 ", "Product": "Loyalty CO-brand" }, { "Budget Actual Consumption": "11.00 ", "Budget Planned Consumption": "60.00 ", "Product": "Loaylty Rebates" }, { "Budget Actual Consumption": "10.00 ", "Budget Planned Consumption": "7.00 ", "Product": "Loaylty Rebates" }, { "Budget Actual Consumption": "9.00 ", "Budget Planned Consumption": "8.00 ", "Product": "Loyalty CO-brand" }] }, 
    newArr = [], bac = 'Budget Actual Consumption', pac = 'Budget Planned Consumption'; 

org.orgs.forEach(function (o) { 
    if (!this[o.Product]) { 
     this[o.Product] = {name: o.Product, bac: +o[bac], pac: +o[pac]}; 
     newArr.push(this[o.Product]); 
    } else { 
     this[o.Product]['bac'] += +o[bac]; 
     this[o.Product]['pac'] += +o[pac]; 
    }     
}, {}); 

console.log(JSON.stringify(newArr, 0, 4)); 

出力:

[ 
    { 
     "name": "Loyalty CO-brand", 
     "bac": 21, 
     "pac": 58 
    }, 
    { 
     "name": "Loaylty Rebates", 
     "bac": 21, 
     "pac": 67 
    } 
] 
関連する問題