代码之家  ›  专栏  ›  技术社区  ›  123onetwothree

递归解析对象数组并基于id过滤对象

  •  0
  • 123onetwothree  · 技术社区  · 7 年前

    [
      {
        "id": "20584",
        "name": "Produits de coiffure",
        "subCategory": [
          {
            "id": "20590",
            "name": "Coloration cheveux",
            "subCategory": [
              {
                "id": "20591",
                "name": "Avec ammoniaque"
              },
              {
                "id": "20595",
                "name": "Sans ammoniaque"
              },
              {
                "id": "20596",
                "name": "Soin cheveux colorés"
              },
              {
                "id": "20597",
                "name": "Protection"
              },
              {
                "id": "20598",
                "name": "Nuancier de couleurs"
              }
            ]
          },
          {
            "id": "20593",
            "name": "Soins cheveux",
            "subCategory": [
              {
                "id": "20594",
                "name": "Shampooing"
              },
              {
                "id": "20599",
                "name": "Après-shampooing"
              },
              {
                "id": "20600",
                "name": "Masques"
              },
    

    我尝试了在stackoverflow中搜索的一切。。

    假设在这个数组上,我想递归地获得具有指定id的and对象 20596

    {
                "id": "20596",
                "name": "Soin cheveux colorés"
              }
    

    我这样做的逻辑是这样的:

    var getSubcategory = getCategory.filter(function f(obj){
            if ('subCategory' in obj) {
                return obj.id == '20596' || obj.subCategory.filter(f);
            }
            else {
                return obj.id == '20596';
            }
        });
    

    不知道还能做什么。

    注:我不在浏览器中使用它,所以我不能使用任何库。只有服务器端,没有其他库。 find filter

    1 回复  |  直到 7 年前
        1
  •  1
  •   Nina Scholz    7 年前

    function find(array, id) {
        var result;
        array.some(function (object) {
            if (object.id === id) {
                return result = object;
            }
            if (object.subCategory) {
                return result = find(object.subCategory, id);
            }
        });
        return result;
    }
    
    var data = [{ id: "20584", name: "Produits de coiffure", subCategory: [{ id: "20590", name: "Coloration cheveux", subCategory: [{ id: "20591", name: "Avec ammoniaque" }, { id: "20595", name: "Sans ammoniaque" }, { id: "20596", name: "Soin cheveux colorés" }, { id: "20597", name: "Protection" }, { id: "20598", name: "Nuancier de couleurs" }] }, { id: "20593", name: "Soins cheveux", subCategory: [{ id: "20594", name: "Shampooing" }, { id: "20599", name: "Après-shampooing" }, { id: "20600", name: "Masques" }] }] }];
      
    console.log(find(data, '20596'));
    console.log(find(data, ''));