使用Underscore,我如何递归地压平对象数组

With Underscore, how do I recursively flatten an array of objects?

本文关键字:数组 对象 递归 Underscore 何递归 使用      更新时间:2023-09-26

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

                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替换为要展开的自定义数据类型,这样就不会弄乱所有对象的全局原型。