Подчеркните, чтобы сгладить вложенный массив родительских/дочерних объектов
У меня есть массив объектов, где каждый объект имеет свойство "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
вызовы будут, скорее всего, быстрее, но разница в скорости не должна Не имеет значения с короткими массивами.