Javascript 将平面列表转换为父子树

Javascript 将平面列表转换为父子树,javascript,arrays,Javascript,Arrays,我正在尝试从一个简单的列表中构建一棵树,我知道我遗漏了一些可以让这变得更简单、更快的东西。我试过几种方法。最新的是我在下面发布的函数 平面列表如下所示: var input = [ { "Parent Category": "Agricultural Feed + Seed", Category: "Agricultural Feed + Seed", Name: "Agfinity" }, { "Parent Category": "Agricult

我正在尝试从一个简单的列表中构建一棵树,我知道我遗漏了一些可以让这变得更简单、更快的东西。我试过几种方法。最新的是我在下面发布的函数

平面列表如下所示:

var input = [
  {
    "Parent Category": "Agricultural Feed + Seed",
    Category: "Agricultural Feed + Seed",
    Name: "Agfinity"
  },
  {
    "Parent Category": "Agricultural Feed + Seed",
    Category: "Agricultural Feed + Seed",
    Name: "Agland Co-op"
  },
  {
    "Parent Category": "Agricultural Feed + Seed",
    Category: "Agricultural Equipment",
    Name: "Agri Supply"
  },
  {
    "Parent Category": "Agricultural Equipment",
    Category: "Tractors",
    Name: "Agway"
  },
  {
    "Parent Category": "Agricultural Equipment",
    Category: "Tractors",
    Name: "Agway2"
  },
  {
    "Parent Category": "Travel",
    Category: "Travel",
    Name: "Amtrak"
  },
  {
    "Parent Category": "Travel",
    Category: "Accessories",
    Name: "Bentley Leathers & Luggage"
  }
];
[
  {
    "label": "Agricultural Feed + Seed",
    "children": [
      {
        "label": "Agfinfity"
      },
      {
        "label": "Agland Co-op"
      },
      {
        "label": "Agricultural Equipment",
        "children": [
          {
            "label": "Agri Supply"
            "children": [
              {
                "label": "Tractors",
                "children": [
                  {
                    "label": "Agway"
                  },
                  {
                    "label": "Agway2"
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
  },
  {
    "label": "Travel",
    "children": [
      {
        "label": "Amtrak"
      },
      {
        "label": "Acessories",
        "children": [
          {
            "label": "Bentley Leathers & Luggage"
          },
      }
    ]
  }
];
从这个列表中,我试图构建一个如下所示的树:

var input = [
  {
    "Parent Category": "Agricultural Feed + Seed",
    Category: "Agricultural Feed + Seed",
    Name: "Agfinity"
  },
  {
    "Parent Category": "Agricultural Feed + Seed",
    Category: "Agricultural Feed + Seed",
    Name: "Agland Co-op"
  },
  {
    "Parent Category": "Agricultural Feed + Seed",
    Category: "Agricultural Equipment",
    Name: "Agri Supply"
  },
  {
    "Parent Category": "Agricultural Equipment",
    Category: "Tractors",
    Name: "Agway"
  },
  {
    "Parent Category": "Agricultural Equipment",
    Category: "Tractors",
    Name: "Agway2"
  },
  {
    "Parent Category": "Travel",
    Category: "Travel",
    Name: "Amtrak"
  },
  {
    "Parent Category": "Travel",
    Category: "Accessories",
    Name: "Bentley Leathers & Luggage"
  }
];
[
  {
    "label": "Agricultural Feed + Seed",
    "children": [
      {
        "label": "Agfinfity"
      },
      {
        "label": "Agland Co-op"
      },
      {
        "label": "Agricultural Equipment",
        "children": [
          {
            "label": "Agri Supply"
            "children": [
              {
                "label": "Tractors",
                "children": [
                  {
                    "label": "Agway"
                  },
                  {
                    "label": "Agway2"
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
  },
  {
    "label": "Travel",
    "children": [
      {
        "label": "Amtrak"
      },
      {
        "label": "Acessories",
        "children": [
          {
            "label": "Bentley Leathers & Luggage"
          },
      }
    ]
  }
];
我有一个这样的函数,几乎可以工作,但我知道这不是正确的方法


    function formatBrandNames(rawBrands) {
      let output = [];

      for (let i = 0; i < rawBrands.length; i++) {
        // Parent Category
        if (!output.find(v => v.label === rawBrands[i]["Parent Category"])) {
          output.push({
            label: rawBrands[i]["Parent Category"],
            children: []
          });
        }

        // Category
        let parentCat = output.find(v => v.label === rawBrands[i]["Parent Category"]);
        if (rawBrands[i]["Category"] === parentCat.label) {
          const name = trimBrandNumbers(rawBrands[i]["Name"]);

          parentCat.children.push({ label: name });
          continue;
        }
        if (!parentCat.children.find(v => v.label === rawBrands[i]["Category"])) {
          parentCat.children.push({ label: rawBrands[i]["Category"], children: [] });
        }

        // Name
        let cat = parentCat.children.find(v => v.label === rawBrands[i]["Category"]);
        const name = trimBrandNumbers(rawBrands[i]["Name"]);

        cat.children.push({ label: name });
      }

      return output;
    }

函数formatBrandNames(rawBrands){
让输出=[];
for(设i=0;iv.label==rawBrands[i][“父类别”])){
输出推送({
标签:rawBrands[i][“父类别”],
儿童:[]
});
}
//类别
让parentCat=output.find(v=>v.label==rawBrands[i][“父类别]);
if(rawBrands[i][“类别”]==parentCat.label){
const name=TrimbrandNumber(rawBrands[i][“name]”);
parentCat.children.push({label:name});
继续;
}
if(!parentCat.children.find(v=>v.label===rawBrands[i][“Category”])){
parentCat.children.push({label:rawBrands[i][“Category”],children:[]});
}
//名字
让cat=parentCat.children.find(v=>v.label==rawBrands[i][“Category]”);
const name=TrimbrandNumber(rawBrands[i][“name]”);
cat.children.push({label:name});
}
返回输出;
}

如果您对此有任何帮助或见解,我们将不胜感激。

逻辑可以简化为

如果节点没有父类别,则它是根类别之一

按父节点的类别查找父节点,然后将节点添加到父节点的子节点

如果父级不存在,请创建它


每个节点都有一个
ParentCategory
?可能重复yes@jonaswillms,但有些节点有相同的类别和父类别。这很有趣。哦,是的,如果我将条件更改为
if(Parent==Category)
,这几乎是正确的,我只是在为孩子们摆脱空数组。这远不是完美的,而是一个起点