使用Underscore,我如何递归地压平对象数组
With Underscore, how do I recursively flatten an array of objects?
我有一个树/可遍历对象,如下所示:
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
替换为要展开的自定义数据类型,这样就不会弄乱所有对象的全局原型。
相关文章:
- 将数组对象传递到struts2中的操作类
- 如何使用jquery返回php-json数组对象
- 从其名称获取javascript数组对象
- 值未与数组对象绑定
- 如何按数组/对象值的倍数过滤对象数组
- 在表中显示数组对象
- 在数组对象中分组
- 将第二个或多个数组推送到数组对象 AngularJS 中
- 重新排列 JavaScript 数组/对象
- 键上的javascript数组对象过滤器
- handontable:在不更改数据数组/对象的情况下隐藏某些列
- 用于跟踪购物车可用性的Javascript数组/对象/哈希表
- 重建有角度的java脚本数组对象
- 对JSON数组对象进行排序
- 连接与数组对象相关的文本:方式和位置
- 哪些浏览器和版本支持将常见的类数组对象直接传递到fn.apply()
- 如何使用Handlebars循环数组对象和模板
- 是否可以引用JS数组/对象中的另一个元素
- Javascript中的名称索引-数组/对象
- 数组长度不等于数组对象