最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

JavaScript中具有多个级别的嵌套对象的组数组

网站源码admin20浏览0评论

JavaScript中具有多个级别的嵌套对象的组数组

JavaScript中具有多个级别的嵌套对象的组数组

我正在尝试将具有多个属性的大型嵌套对象归为一组:

[
  {
    "id": 14,
    "name": "Name14",
    "theme": true,
    "sub": {
      "id": 70,
      "name": "Name70"
    }
  },
  {
    "id": 14,
    "name": "Name14",
    "theme": true,
    "sub": {
      "id": 61,
      "name": "Name61"
    }
  },
  {
    "id": 14,
    "name": "Name14",
    "theme": true,
    "sub": {
      "id": 4,
      "name": "Name4",
      "sub": {
        "id": 5,
        "name": "Name5",
        "sub": {
          "id": 29,
          "name": "Name29"
        }
      }
    }
  },
  {
    "id": 14,
    "name": "Name14",
    "theme": true,
    "sub": {
      "id": 4,
      "name": "Name4",
      "sub": {
        "id": 5,
        "name": "Name5",
        "sub": {
          "id": 8,
          "name": "Name8",
          "sub": {
            "id": 163,
            "name": "Name163"
          }
        }
      }
    }
  },
  {
    "id": 10,
    "name": "Name10",
    "sub": {
      "id": 4,
      "name": "Name4"
    }
  }
]

如您所见,“ sub”到现在还不是数组,但是即使其中只有一个对象,它们也将出现在预期的输出中。我想按对象的ID递归对数组进行分组,以获得这种输出:

[
  {
    "id": 14,
    "name": "Name14",
    "theme": true,
    "sub": [
      {
        "id": 70,
        "name": "Name70"
      },
      {
        "id": 61,
        "name": "Name61"
      },
      {
        "id": 4,
        "name": "Name4",
        "sub": [
          {
            "id": 5,
            "name": "Name5",
            "sub": [
              {
                "id": 29,
                "name": "Name29"
              },
              {
                "id": 8,
                "name": "Name8",
                "sub": [
                  {
                    "id": 163,
                    "name": "Name163"
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
  },
  {
    "id": 10,
    "name": "Name10",
    "sub": [
      {
        "id": 4,
        "name": "Name4"
      }
    ]
  }
]

到目前为止,我使用lodash和d3.nest()尝试了一些恶作剧,但似乎无法将其分组。你们曾经面对过类似的事情吗?如果是这样,您如何设法编写此代码?

非常感谢

回答如下:

您可以为每个Map属性创建一个sub-用id键控-将对象合并到那些映射中。然后最后将这些sub -maps转换回sub -arrays:

function mergeArray(arr) {
    function mergeObject(a, b) {
        while (b = b.sub) {
            if (!a.sub) a.sub = new Map;
            let child = a.sub.get(b.id);
            if (child) a = child;
            else a.sub.set(b.id, a = { id: b.id, name: b.name });
        }
    }

    function convertMap(map) {
        return Array.from(map.values(), obj => {
            if (obj.sub) obj.sub = convertMap(obj.sub);
            return obj;
        });
    }

    let map = new Map(arr.map(({id, name}) => [id, {id, name}]));
    for (let item of arr) mergeObject(map.get(item.id), item);
    return convertMap(map);
}

// Demo with input from question
let input = [{"id": 14,"name": "Name14","theme": true,"sub": {"id": 70,"name": "Name70"}},{"id": 14,"name": "Name14","theme": true,"sub": {"id": 61,"name": "Name61"}},{"id": 14,"name": "Name14","theme": true,"sub": {"id": 4,"name": "Name4","sub": {"id": 5,"name": "Name5","sub": {"id": 29,"name": "Name29"}}}},{"id": 14,"name": "Name14","theme": true,"sub": {"id": 4,"name": "Name4","sub": {"id": 5,"name": "Name5","sub": {"id": 8,"name": "Name8","sub": {"id": 163,"name": "Name163"}}}}},{"id": 10,"name": "Name10","sub": {"id": 4,"name": "Name4"}}];

console.log(mergeArray(input));
发布评论

评论列表(0)

  1. 暂无评论