首页 > 解决方案 > 如何根据另一个值列表从地图列表中提取值

问题描述

我有一张地图清单:

final list1 = [
        {
            "article": "1",
            "category": "accessory"
        },
        {
            "article": "1",
            "category": "tennis"
        },
        {
            "article": "2",
            "category": "tennis"
        },
        {
            "article": "2",
            "category": "ball"
        },
        {
            "article": "2",
            "category": "accessory"
        },
        {
            "article": "3",
            "category": "tennis"
        },
        {
            "article": "3",
            "category": "clothes"
        },


];

如您所见,我在这里有 3 篇独特的文章 : ["1", "2", "3"],但有 4 个独特的类别:["accessory", "tennis", "ball", "clothes"]

现在我想从中提取值list1

final categoryList = ["tennis", "accessory"];

我需要从包含“categoryList”中所有类别的“list1”中提取文章。

我的预期结果:

list2 = ["1", "2"];

感谢任何帮助。先感谢您。

标签: arraysflutterdart

解决方案


我将首先反转您的数据结构,这样您就可以拥有一个类别到一个文章 ID,而不是每个都有一个文章 ID 和一个类别的a Listof s 。(实际上, a of 类别比 a 更容易匹配。)MapMapMapListSetList

一旦你有了它,你就可以从 中迭代所需的类别categoryList,检索Set相关文章 ID 的结果,并使用它Set.interaction来查找所有它们的交集:

void main() {
  // Original `List` of `Map`s.
  final list1 = [
    {"article": "1", "category": "accessory"},
    {"article": "1", "category": "tennis"},
    {"article": "2", "category": "tennis"},
    {"article": "2", "category": "ball"},
    {"article": "2", "category": "accessory"},
    {"article": "3", "category": "tennis"},
    {"article": "3", "category": "clothes"},
  ];

  // Create a single `Map` of categories to article IDs.
  var categories = <String, Set<String>>{};
  for (var map in list1) {
    var category = map['category']!;
    var articles = categories[category] ??= <String>{};
    articles.add(map['article']!);
  }

  final categoryList = ["tennis", "accessory"];

  // Search.
  var matchingArticleIDs = <Set<String>>[
    for (var category in categoryList) categories[category] ?? <String>{},
  ].reduce((resultSoFar, set) => resultSoFar.intersection(set));
  print(matchingArticleIDs); // Prints: {1, 2}
}

或者,您可以有一个Map文章 ID 到一个Set类别,然后遍历所有条目以找到那些具有您想要的超集的条目categoryList

  // Create a single `Map` of article IDs to categories.
  var articles = <String, Set<String>>{};
  for (var map in list1) {
    var articleID = map['article']!;
    var categories = articles[articleID] ??= <String>{};
    categories.add(map['category']!);
  }

  // Search.
  var matchingArticleIDs = [
    for (var mapEntry in articles.entries)
      if (mapEntry.value.containsAll(categoryList)) mapEntry.key,
  ];
  print(matchingArticleIDs); // Prints: [1, 2]

推荐阅读