Подчеркните, чтобы сгладить вложенный массив родительских/дочерних объектов

У меня есть массив объектов, где каждый объект имеет свойство "children" (пример ниже). Я хочу сгладить родителей/детей в один массив, причем каждый родитель сразу же следует за ним.

Я написал следующее, используя lo-dash/underscore, и он работает, когда у меня есть один и только один ребенок для каждого родителя:

_.flatten(_.zip(myArr, _.flatten(myArr, "children")))

Я знаю, что могу использовать что-то вроде _.each и строить объект, просто задаваясь вопросом, есть ли способ, который можно использовать, используя _.

Пример данных:

[{
    name: "Some Name",
    value: 1234,
    children: [{
        name: "Another name",
        value: 3456
    }, {
        name: "A third name",
        value: 9876
    }]
}, {
    name: "Omg Lazer Guns",
    value: 3333,
    children: [{
        name: "PewPewPew",
        value: 4444
    }]
}];

Ответ 1

Простым и понятным способом для этого является

var list = [];
_.each(data, function(item){
    list.push(_.omit(item, 'children'));
    list.push(_.flatten(_.pick(item, 'children')));
});
var result = _.flatten(list);

Результат

[{
    "name": "Some Name",
    "value": 1234
}, {
    "name": "Another name",
    "value": 3456
}, {
    "name": "A third name",
    "value": 9876
}, {
    "name": "Omg Lazer Guns",
    "value": 3333
}, {
    "name": "PewPewPew",
    "value": 4444
}]

Ответ 2

Обычный подход для слияния массивов, который вы хотите использовать, zip, и вы можете использовать pluck, чтобы извлечь детей. Что-то вроде этого:

var mangled = _(myArr).chain()
                      .zip(_(myArr).pluck('children'))
                      .flatten() 
                      .value()

Это оставит вас с undefined записями в mangled, если какой-либо элемент верхнего уровня myArr вообще не имеет ключей children. Вы можете выбросить compact, чтобы избавиться от них:

var mangled = _(myArr).chain()
                      .zip(_(myArr).pluck('children'))
                      .flatten()
                      .compact()
                      .value()

Демо: http://jsfiddle.net/ambiguous/aeS86/

Конечно, выполнение манипуляции с петлями пары for, а некоторые push вызовы будут, скорее всего, быстрее, но разница в скорости не должна Не имеет значения с короткими массивами.