2016-07-01 1 views
0

Учитывая следующую структуру данных:underscore.js расплющить структуры объекта с ключ-значение пары массив детей

var data = [{ 
    name: "Some Name", 
    id: 1, 
    children: [ 
     { name: "prop1", value: 1 }, 
     { name: "prop2", value: 2 }, 
     { name: "prop3", value: 3 } 
    ] 
}, 
{ 
    name: "Some Other Name", 
    id: 2, 
    children: [ 
     { name: "prop1", value: 4 }, 
     { name: "prop2", value: 5 }, 
     { name: "prop3", value: 6 } 
    ] 
}]; 

... где дети это динамический список, я «придавить» эту структуру, используя пару _.each петли, как так:

_.each(data, d => { 
    _.each(d.children, c => { 
     d[c.name] = c.value; 
    }) 
}); 

... только для достижения 2-мерную структуру данных, как:

[{ 
    name: "Some Name", 
    id: 1, 
    prop1: 1, 
    prop2: 2, 
    prop3: 3 
}, 
{ 
    name: "Some Other Name", 
    id: 2, 
    prop1: 4, 
    prop2: 5, 
    prop3: 6 
}]; 

Так что я надеялся, что может быть аккуратный способ добиться этого с помощью undercore.js?

JSFiddle играть: http://jsfiddle.net/3m3dsv47/

+0

нотабене нет. детей – Tsar

ответ

0

Это решение использует UnderscoreJS. В отличие от вашего собственного решения, это не изменяет исходные данные, а создает его копию. Я бы не сказал, что это «намного аккуратнее», однако здесь :)

_.map(data, function(e){ 
    return _.defaults({name: e.name, id: e.id}, 
     _.reduce(e.children, function (acc, e) { 
     acc[e.name] = e.value; return acc; 
     }, {}) 
    ); 
    }); 

Если я применить это к вашим данным я получаю

[ 
    {"name":"Some Name","Prop1":1,"Prop2":2,"Prop3":3}, 
    {"name":"Some Other Name","Prop1":4,"Prop2":5,"Prop3":6} 
] 

Можно также опустить _.reduce. Хотя это может выглядеть немного более изящным, из-за повторения всех детей в два раза (_.pluck), он даже менее эффективен, чем первый.

_.map(data, function(e){ 
    return _.defaults({id: e.id, name: e.name}, 
     _.object(_.pluck(e.children, 'name'), _.pluck(e.children, 'value')) 
    ); 
});