json内多数组的相同值合并加入数组,解析成树问题

我想要把一个json数组进行相同值合并分类,自己用循环蒙圈了,通过js或者php操作,该怎么办??

原始数据
[
    {"id":"1000", "name": "监控", "city": "成都", "value": 9},
    {"id":"1001", "name": "手机", "city": "上海", "value": [1,2]},
    {"id":"1002", "name": "电脑", "city": "重庆", "value": 2},
    {"id":"1002", "name": "电脑", "city": "北京", "value": [3,4,8]},
    {"id":"1002", "name": "平板", "city": "杭州", "value": 8}
]
想要得到的数据*
[
  {"id": "1000","tree": [
      {"name": "监控","data": [
          {"city": "成都","value": 9}
        ]
      }
    ]
  },
  {"id": "1001","tree": [
      {"name": "手机","data":[
          {"city": "上海","value": [1,2]}
        ]
      }
    ]
  },
  {"id": "1002",
    "tree": [
      {"name": "电脑",
        "data": [
          {"city": "重庆","value": 2},
          {"city": "北京","value": [3,4,8]}
        ]
      },
      {"name": "平板",
        "data": [
          {"city": "天津","value": 8}
        ]
      }
    ]
  }
]

img


    const arr = [
      { id: "1000", name: "监控", city: "成都", value: 9 },
      { id: "1001", name: "手机", city: "上海", value: [1, 2] },
      { id: "1002", name: "电脑", city: "重庆", value: 2 },
      { id: "1002", name: "电脑", city: "北京", value: [3, 4, 8] },
      { id: "1002", name: "平板", city: "杭州", value: 8 },
    ];
    let treeArr = [];
    arr.forEach((t) => {
      if (treeArr.length === 0) {
        treeArr.push({
          id: t.id,
          tree: [
            {
              name: t.name,
              data: [{ city: t.city, value: t.value }],
            },
          ],
        });
      } else {
        const exist = treeArr.find((x) => x.id === t.id);
        if (!exist) {
          treeArr.push({
            id: t.id,
            tree: [
              {
                name: t.name,
                data: [{ city: t.city, value: t.value }],
              },
            ],
          });
        } else {
          exist.tree.push({
            name: t.name,
            data: [{ city: t.city, value: t.value }],
          });
        }
      }
    });
    console.log("treeArr", treeArr);