使用嵌套的对象列表展平对象列表

flatten a list of objects with nested lists of objects

我有一个 javascript 列表,其形式为:

var list = [{id:1, data: "string", list: [
              {id:2, data: "string", list: [
                {id:3, data: "string", list: null}]},
              {id:4, data: "string", list: null}]}];

我希望它采用以下形式:

var list = [{id:1, data: "string", list: \ original nested list or null, I don't care},
            {id:2, data: "string", list:},
            {id:3, data: "string", list:},
            {id:4, data: "string", list:}];

我可以访问 underscore.js,但我无法生成我想要的输出。 我尝试使用 _.flatten_.pluck 的组合来获取基础列表,但我还需要 id 属性 所以这不起作用。 我的猜测是我需要映射一个函数,但我现在有点迷失在这个问题上。

有人可以帮我解决这个问题吗?

你可以使用递归来完成:

function flatten(arr) {
    if (!arr) {
        return [];
    }
    return arr.reduce(function (r, i) {
        return r.concat([i]).concat(flatten(i.list));
    }, []);
}

console.log(flatten(list));

使用 ES6 语法(箭头函数和扩展运算符)它可能看起来像这样:

function flatten(arr) {
    return arr ? arr.reduce((r, i) => [...r, i, ...flatten(i.list)], []) : [];
}