2015-09-19 30 views
0

對象數組假設我有以下列表:變換使用JavaScript和Underscore.js

var products = [ 
    {"id": 6, "name": "product6", "category": "category2", "1": 54, "2": 37, "3": 64, "4":6, "5": 46, "6": 32, "7": 3}, 
    {"id": 5, "name": "product5", "category": "category2", "1": 54, "2": 37, "3": 64, "4":6, "5": 46, "6": 32, "7": 3}, 
    {"id": 7, "name": "product7", "category": "category1", "1": 54, "2": 37, "3": 64, "4":6, "5": 46, "6": 32, "7": 3}, 
    {"id": 1, "name": "product1", "category": "category1", "1": 54, "2": 37, "3": 64, "4":6, "5": 46, "6": 32, "7": 3}, 
    {"id": 3, "name": "product3", "category": "category2", "1": 54, "2": 37, "3": 64, "4":6, "5": 46, "6": 32, "7": 3}, 
    {"id": 8, "name": "product8", "category": "category1", "1": 54, "2": 37, "3": 64, "4":6, "5": 46, "6": 32, "7": 3}, 
    {"id": 2, "name": "product2", "category": "category3", "1": 54, "2": 37, "3": 64, "4":6, "5": 46, "6": 32, "7": 3}, 
    {"id": 4, "name": "product4", "category": "category1", "1": 54, "2": 37, "3": 64, "4":6, "5": 46, "6": 32, "7": 3} 
] 

我怎麼會那麼把它變成像這樣使用JavaScript和「理想underscore.js GROUPBY(或考慮下面的表格佈局,有你有任何想法如何將在這裏也是個月?)。當我看到它下面的嵌套 結構會得到我的「幾乎」沒有。

var hierarchicalList = [ 
    { 
     "id": -1, // something unique I guess? 
     "name": "category1", 
     "1": 216, // aggregate number of sales per week for all children 
     "2": 148, 
     "3": 256, 
     "4": 24, 
     "5": 184, 
     "6": 128, 
     "7": 12, 
     "children": [ 
      { 
       "id": 7, 
       "name": "product7", 
       "1": 54, 
       "2": 37, 
       "3": 64, 
       "4":6, 
       "5": 46, 
       "6": 32, 
       "7": 3 
      } 
      { 
       "id": 1, 
       "name": "product1", 
       "1": 54, 
       "2": 37, 
       "3": 64, 
       "4":6, 
       "5": 46, 
       "6": 32, 
       "7": 3 
      } 
     ] 
    }, 
    { 
     "id": -2, 
     "name": "category2", 
     "1": 162, 
     "2": 111, 
     ... 
     "7": 9, 
     "children": [ 
      // product6, 5, 3 
     ] 
    } 
] 

我將使用這對於表格中產品類別的「行分組」,我在哪裏歐凱堵塞我像幹鍋 一個反應格柵部分數據結構可以這麼總結,在我的情況會怎樣我:

  • 得到每類每星期從下劃線GROUPBY分類結果彙總銷售?

https://jsfiddle.net/zt62a3Lc/

+0

它是你真的有責任證明你已經嘗試解決你的問題 – charlietfl

+0

我同意 - 請張貼一些代碼,即使它不工作,這樣我們就可以幫你解決這個問題。 – Sam

+0

我現在沒有比https://jsfiddle.net/zt62a3Lc/更多的東西了。這個分組工作有點,但每個類別每週的銷售總量是缺乏的 - 整個月也是如此。我可以使用一些關於如何在這個數據結構/表中實現幾個月的輸入。我對underscore.js很陌生,但我覺得它可能是適合這個的正確工具 – Dac0d3r

回答

0

嘛。這是一個潛在的解決方案。它可能不會使用_.groupBy,但是如果你強迫自己走下這條路,你可能會試圖用雙手綁在背後解決問題。

var categoryGraft = {}; 
products.forEach(function (product) { 
    var key = product.category; 
    if (typeof categoryGraft[key] === 'undefined') { 
     categoryGraft[key] = { 
      "1": 0, "2": 0, "3": 0, "4": 0, "5": 0, "6": 0, "7": 0, 
      "name": key, 
      "children": [] 
     }; 
    } 

    categoryGraft[key]["1"] += product["1"]; 
    categoryGraft[key]["2"] += product["2"]; 
    categoryGraft[key]["3"] += product["3"]; 
    categoryGraft[key]["4"] += product["4"]; 
    categoryGraft[key]["5"] += product["5"]; 
    categoryGraft[key]["6"] += product["6"]; 
    categoryGraft[key]["7"] += product["7"]; 

    // delete from original or clone... 
    delete product.category; 
    categoryGraft[key].children.push(product); 
}); 

var hierarchicalList = []; 
var key, category; 
for (key in categoryGraft) { 
    category = categoryGraft[key]; 
    hierarchicalList.push(category); 
} 
0

下面是使用_.chain()

它不侷限於1 to 7並與任意數量的數值屬性的作品在我的解決方案。此外,它是一個功能性解決方案,不會突變任何變量。

var products = [ 
     {"id": 6, "name": "product6", "category": "category2", "1": 54, "2": 37, "3": 64, "4":6, "5": 46, "6": 32, "7": 3}, 
     {"id": 5, "name": "product5", "category": "category2", "1": 54, "2": 37, "3": 64, "4":6, "5": 46, "6": 32, "7": 3}, 
     {"id": 7, "name": "product7", "category": "category1", "1": 54, "2": 37, "3": 64, "4":6, "5": 46, "6": 32, "7": 3}, 
     {"id": 1, "name": "product1", "category": "category1", "1": 54, "2": 37, "3": 64, "4":6, "5": 46, "6": 32, "7": 3}, 
     {"id": 3, "name": "product3", "category": "category2", "1": 54, "2": 37, "3": 64, "4":6, "5": 46, "6": 32, "7": 3}, 
     {"id": 8, "name": "product8", "category": "category1", "1": 54, "2": 37, "3": 64, "4":6, "5": 46, "6": 32, "7": 3}, 
     {"id": 2, "name": "product2", "category": "category3", "1": 54, "2": 37, "3": 64, "4":6, "5": 46, "6": 32, "7": 3}, 
     {"id": 4, "name": "product4", "category": "category1", "1": 54, "2": 37, "3": 64, "4":6, "5": 46, "6": 32, "7": 3} 
    ] 

    // null coalescing helper 
    var coal = (a, b) => a != null ? a : b 

    _.chain(products) 
    // make an object: {category1: [...], category2: [...], ...} 
    .groupBy(c => c.category) 
    .mapObject((val, key) => 
     _.chain(val) 
     .reduce(
      ((a, b) => 
       _.chain(_.chain(a).keys().union(_.keys(b)).value()) 
       .filter(k => !_(['name', 'id']).contains(k)) 
       .map(k => 
        [k, !isNaN(parseInt(k)) ? coal(a[k], 0) + coal(b[k], 0) : coal(a[k], b[k])] 
       ) 
       .concat([["children", _(a.children).concat(b)]]) 
       .object() 
       .value() 

      ), {children: []} 
     ) 
     .value() 
    ) 
    // convert the object into a list of pairs [["category1", {...}], ["category2", {...}], ...] 
    .pairs() 
    .map((d, i) => 
     // d is a pair: ["category1", {...}] 
     _.extend(d[1], {name: d[0], id: (i+1) * -1}) // make the id 
    ) 
    .value()