2015-09-19 4 views
0

Предполагая, что у меня есть следующий список:Transform массив объектов с использованием 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 группеПо (или с учетом макет таблицы ниже, у вас есть какие-либо идеи, как включить месяцы здесь также?). Как я вижу ниже вложенные структуры получит меня «почти» там.

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 
     ] 
    } 
] 

Я собираюсь использовать это для «группировки строк» ​​по категории продукта в таблице, где я oking подключить мой структура данных в компоненте среагировать сетки, как Griddle Итак, подведем итог, в моем случае, как бы я:

  • получить агрегированные продаж в каждой категории в неделю из категории результата Подчеркивание GroupBy?

https://jsfiddle.net/zt62a3Lc/

+0

это действительно действующий на вас, чтобы показать, что вы пытались решить проблему – charlietfl

+0

Я согласен - пожалуйста, напишите код, даже если он не работает, так что мы можем помочь вам исправить. – Sam

+0

У меня сейчас не больше https://jsfiddle.net/zt62a3Lc/. Группировка работает несколько, но агрегирование продаж в неделю для каждой категории не хватает - так и весь месяц. Я мог бы использовать некоторые данные о том, как внедрять месяцы в эту структуру данных/таблицу. Я довольно новичок в underscore.js, но я считаю, что это может быть правильным инструментом для этого – Dac0d3r

ответ

0

Ну. Вот потенциальное решение. Он может не использовать _.groupBy, но IMO, если вы заставите себя по этому пути, вы можете решить проблему с руками, связанными за спиной.

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() 
Смежные вопросы