【问题标题】:searching a map in dart and returning all values matching search在 dart 中搜索地图并返回匹配搜索的所有值
【发布时间】:2021-09-15 06:57:56
【问题描述】:

我有一张地图,有多个图层,其中一些图层有一个事件字段,其中可能包含 0 个或多个事件列表。 一些事件嵌套在地图的更深处,而另一些则更靠近顶层。

graphql 查询结果如下所示:

    {
      "data": {
        "users": [
          {
            "id": 16,
            "friends": [
              {
                "senderId": 16,
                "receiverId": 17,
                "userByReceiverid": {
                  "id": 17,
                  "events": [],
                  "friends": [
                    {
                      "receiverId": 14,
                      "userByReceiverid": {
                        "id": 14,
                        "events": [
                          {
                            "id": 3,
                            "photoUrl": "none",
                            "name": "hello",
                            "date": "1982-06-27",
                            "startTime": "01:00:00+00",
                            "endTime": "02:00:00+00",
                            "fee": "$2.00",
                            "maxNumber": 10,
                            "ageRestriction": "none",
                            "about": "amazing",
                            "allowShare": false,
                            "private": false,
                            "timestamp": "2021-06-26T17:57:13.224383+00:00",
                            "senderId": 14
                          }
                        ]
                      }
                    },
                    {
                      "receiverId": 20,
                      "userByReceiverid": {
                        "id": 20,
                        "events": []
                      }
                    }
                  ]
                }
              }
            ],
            "friendsByReceiverid": [
              {
                "senderId": 20,
                "receiverId": 16,
                "user": {
                  "id": 20,
                  "events": [],
                  "friendsByReceiverid": [
                    {
                      "receiverId": 20,
                      "user": {
                        "id": 14,
                        "events": [
                          {
                            "id": 3,
                            "photoUrl": "none",
                            "name": "hello",
                            "date": "1982-06-27",
                            "startTime": "01:00:00+00",
                            "endTime": "02:00:00+00",
                            "fee": "$2.00",
                            "maxNumber": 10,
                            "ageRestriction": "none",
                            "about": "amazing",
                            "allowShare": false,
                            "private": false,
                            "timestamp": "2021-06-26T17:57:13.224383+00:00",
                            "senderId": 14
                          }
                        ]
                      }
                    },
                    {
                      "receiverId": 20,
                      "user": {
                        "id": 17,
                        "events": []
                      }
                    }
                  ]
                }
              }
            ]
          }
        ]
      }
    }

我想搜索Map 并创建一个包含所有唯一事件的列表,因此尽可能不要重复。

我将如何在任何给定点从地图中仅提取事件字段?

【问题讨论】:

  • 请格式化您的数据。没有人愿意阅读一段密密麻麻的数据文本。
  • 这是从graphql查询的hashmap转换时出现的方式,我将从客户端发布graphql回复,看起来更好看。

标签: flutter dart graphql


【解决方案1】:

基本上您需要的是一个函数 (visitObject),它遍历 Map 的每个键并递归调用自身,直到检查完所有属性。

该函数还应该检查它可以操作的可能类型并处理数据,以便您可以使用正确的参数调用visitObject 函数。

我相信这里正确的数据结构是Set。在dart 中,Set 被定义为一个对象集合,其中每个对象只能出现一次。 但是Set 一个集合会退回到相等的 dart 方法,即 == 运算符,因此您需要使用事件调用或使用像 BuiltValue 这样的包,它将生成 == 运算符你的值类型。

这是一个可以帮助您入门的示例,我已经为您留下了相等性检查,以确定最好的方法以及您希望如何应用它。

final Set<Map<String, dynamic>> items = {};

void main() {
    visitObject(data);
}

void visitObject(object) {
  if (object is List) {
    for(dynamic item in object) {
      visitObject(item);
    }
  } else if (object is Map) {
    if (object.containsKey('events')) {
      var _events = object['events'];
      if (_events is List && _events.isNotEmpty) {
        _events.forEach((e) {
          if (!items.contains(e)) {
            items.add(e);
          }
        });
      }
    }
    for (dynamic item in object.values) {
      visitObject(item);
    }
  }
}

平等的补充阅读:

【讨论】:

  • 嘿!谢谢,我觉得可行!! :) 在哪里可以学习如何做你向我解释的?你推荐什么书/网站?我想用飞镖变得更好。谢谢!
  • 我已经用这个问题的一些资源更新了答案。 dart 文档是一个很好的起点,如果我找到任何关于 dart 的好资源,我会发布和更新,那里
猜你喜欢
  • 2018-05-09
  • 2021-08-14
  • 1970-01-01
  • 2021-02-28
  • 1970-01-01
  • 2017-05-20
  • 1970-01-01
  • 2014-06-05
  • 1970-01-01
相关资源
最近更新 更多