我有一个树/可遍历对象,如下所示:
var data = {children: [
{
name: 'foo',
url: 'http://foo',
children: [
{
name: 'bar',
url: 'http://bar',
children: []
}
]
},
{
name: 'baz',
url: 'http://baz',
children: []
},
{
name: 'biff',
children: []
}
]};
我需要做的是将数据展平为一维列表:
var flattenedData = [{name: 'foo', url: 'http://foo'}, {name: 'bar', url: 'http://bar'}, {name: 'baz', url: 'http://baz'}, {name: 'biff'}];
目前,我创建了一个递归辅助函数来遍历数据结构并将结果推送到数组中。如果可能的话,我想做得更实用。像这样的东西:
var flattenedData = _.chain(data.children).flatten().filter(function(item){//real filtering; return item;}).value();
问题是,展平似乎并没有展平对象数组,而只是展平简单的数组。我可能是错的。
如何以更实用的方式执行此任务,而无需在辅助函数中遍历树?
最佳答案
我不明白你所说的“展平似乎并没有展平对象数组,只是简单的数组”是什么意思 - 怎么会这样?它绝对可以压平任何类型的数组。无论如何,使用 reduce
的简单一次性解决方案:
Object.prototype.flatten = function () {
if (this instanceof Array) {
return this.reduce(function(a, b) {
return a.concat(b.flatten());
}, []);
}
var res = [];
// this is the example condition
if (this.url !== undefined) {
res.push(this);
}
return res.concat(this.children.flatten());
};
var flat_data = data.flatten();
print(flat_data);
顺便说一句,建议将 Object
替换为您想要展平的自定义数据类型,这样就不会弄乱所有对象的全局原型(prototype)。
关于javascript - 使用 Underscore,如何递归地展平对象数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26466653/