javascript - 使用 Underscore,如何递归地展平对象数组?

标签 javascript functional-programming underscore.js

我有一个树/可遍历对象,如下所示:

                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/

相关文章:

javascript - 比较 undefined 和 false 的非常奇怪的行为

javascript - 查找 javascript map 的相邻条目?

functional-programming - 如何在 Scheme 中使用声明(类型、内联、优化)?

c++ - 使用 lambda 将一种类型的 vector 映射到另一种类型

c++ - 返回一个函数指针,具有可变数量的参数

jquery - 主干路由器不会触发事件

javascript - backbone.js:防止 <th> 消失

javascript - 使用 jquery 在动态字符串中查找元素

javascript - 是否可以删除 Outlook 加载项中的漫游数据?

javascript - underscore.js 模板函数引用错误