如何遍历地图列表中的子项?

时间:2019-05-14 03:06:31

标签: dart flutter

在我的应用中,我有一个列表,其中包含idparentId彼此相关。拥有parentId : 0的地图应该是最高的父母,其次是其他孩子。

var _maps = [
  {
    "id": 31,
    "parentId": 4
    },
  {
    "id": 34,
    "parentId": 4
    },
  {
    "id": 39,
    "parentId": 22
    },
  {
    "id": 29,
    "parentId": 3
    },
  {
    "id": 6,
    "parentId": 0
    },
  {
    "id": 21,
    "parentId": 6
    },
  {
    "id": 27,
    "parentId": 3
    },
  {
    "id": 28,
    "parentId": 3
    },
  {
    "id": 32,
    "parentId": 4
    },
  {
    "id": 33,
    "parentId": 4
    },
  {
    "id": 38,
    "parentId": 20
    },
  {
    "id": 30,
    "parentId": 3
    },
  {
    "id": 3,
    "parentId": 0
    },
  {
    "id": 35,
    "parentId": 20
    },
  {
    "id": 385,
    "parentId": 3
    },
  {
    "id": 458,
    "parentId": 0
    },
  {
    "id": 40,
    "parentId": 22
    },
  {
    "id": 63,
    "parentId": 6
    },
  {
    "id": 37,
    "parentId": 20
    },
  {
    "id": 41,
    "parentId": 22
    },
  {
    "id": 22,
    "parentId": 6
    },
  {
    "id": 36,
    "parentId": 20
    },
  {
    "id": 11,
    "parentId": 6
    },
  {
    "id": 20,
    "parentId": 6
    },
  {
    "id": 4,
    "parentId": 0
   }
];

我想这样做,它将被转换成这样的树,这样我就可以轻松地从父级访问子级。

{6: {21: {}, 63: {}, 22: {39: {}, 40: {}, 41: {}}, 11: {}, 20: {}} ...

我的方法在某种程度上只是抓住了树的第一个深度,但后来却没有。我正在考虑使用递归,但不知道如何开始。

Map _convertToTree(List maps) {
  Map _parentDict = {};
  maps.forEach((item) {
    if(item["parentId"] == 0) {
      _parentDict[item['id']] = {};
    }
  });

  maps.forEach((item) {
    if(_parentDict.keys.contains(item["parentId"])) {
      _parentDict.keys.forEach((dictItem) {
        if(item['parentId'] == dictItem) {
          _parentDict[dictItem][item['id']] = {};
        }
      }); 
    }   
  });

  return _parentDict;
}

void main() {
  var _dict = _convertToTree(_maps);
  print(_dict);
}

结果:{6: {21: {}, 63: {}, 22: {}, 11: {}, 20: {}}, 3: {29: {}, 27: {}, 28: {}, 30: {}, 385: {}}, 458: {}, 4: {31: {}, 34: {}, 32: {}, 33: {}}}

是否有关于如何解决此问题的建议?谢谢!

0 个答案:

没有答案