构建对象递归

时间:2015-10-24 16:01:56

标签: javascript object iteration

我有一个类似于以下 obj 的对象。

var obj = [
  { id: 1, name: "animals" },
  { id: 2, name: "animals_cat" },
  { id: 3, name: "animals_dog" },
  { id: 4, name: "animals_weazle" },
  { id: 5, name: "animals_weazle_sand shadow weazle" },
  { id: 11, name: "fruits" },
  { id: 32, name: "fruits_banana" },
  { id: 10, name: "threes" },
  { id: 15, name: "cars" }
];

应将对象转换为以下方案:

var items = [
    { id: 11, name: "fruits", items: [
      { id: 32, name: "banana" }
      ]},
    { id: 10, name: "threes" },
    { id: 1, name: "animals", items: [
        { id: 2, name: "cat" },
        { id: 3, name: "dog" },
        { id: 4, name: "weazle", items: [
            { id: 5, name: "sand shadow weazle" }    
        ]}
    ]},
    { id: 15, name: "cars" }
];

我尝试了很多,但遗憾的是没有任何成功。我在 obj 上做了 $。每个,对它进行了拆分('_')并将其推送到了商品。但是,如何才能无限制地将其推向正确的类别呢?

我很高兴能得到任何帮助。

1 个答案:

答案 0 :(得分:2)

也许这有帮助。

它与Array.prototype.forEach一起处理objArray.prototype.reduce用于获取正确的分支,Array.prototype.some用于正确的数组元素以插入新对象。

此提案适用于有序和一致的数据。

var obj = [
        { id: 1, name: "animals" },
        { id: 2, name: "animals_cat" },
        { id: 3, name: "animals_dog" },
        { id: 4, name: "animals_weazle" },
        { id: 5, name: "animals_weazle_sand shadow weazle" },
        { id: 11, name: "fruits" },
        { id: 32, name: "fruits_banana" },
        { id: 10, name: "threes" },
        { id: 15, name: "cars" }
    ],
    tree = [];

obj.forEach(function (a) {
    var path = a.name.split('_'),
        o = {};
    o.id = a.id;
    path.reduce(function (r, b) {
        o.name = b;
        r.some(function (c) {
            if (c.name === b) {
                c.items = c.items || [];
                r = c.items;
                return true;
            }
        });
        return r;
    }, tree).push(o);
});

document.write('<pre>' + JSON.stringify(tree, 0, 4) + '</pre>');

更新:项目独立订单的版本。

var obj = [
        { id: 5, name: "animals_weazle_sand shadow weazle" },
        { id: 32, name: "fruits_banana" },
        { id: 1, name: "animals" },
        { id: 2, name: "animals_cat" },
        { id: 3, name: "animals_dog" },
        { id: 4, name: "animals_weazle" },
        { id: 11, name: "fruits" },
        { id: 10, name: "threes" },
        { id: 15, name: "cars" },
        { id: 999, name: "music_pop_disco_euro"}
    ],
    tree = [];
    
obj.forEach(function (item) {
    var path = item.name.split('_'),
        o = tree;

    path.forEach(function (a, i) {
        var oo = { name: a, items: [] },
            last = path.length - 1 === i,
            found = o.some(function (b) {
                if (b.name === a) {
                    if (last) {
                        b.id = item.id;
                        return true;
                    }
                    b.items = b.items || [];
                    o = b.items;
                    return true;
                }
            });
        if (!found) {
            if (last) {
                o.push({ id: item.id, name: a });                        
            } else {
                o.push(oo);
                o = oo.items;
            }
        }
    });
});

document.write('<pre>' + JSON.stringify(tree, 0, 4) + '</pre>');