簡體   English   中英

如何根據另一個值列表從地圖列表中提取值

[英]How to extract values from a list of maps based on another list of values

我有一個 map 的列表:

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"];

感謝任何幫助。 先感謝您。

我會首先反轉你的數據結構,這樣你就沒有一個MapList ,其中每個Map都有一個文章 ID 和一個類別,你有一個Map的類別到文章 ID List (實際上, Set of categories 比List更容易匹配。)

一旦你有了它,你就可以從categoryList迭代所需的類別,檢索關聯文章 ID 的結果Set ,並使用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]
void main() {
  final list1 = [
    {"article": "14314", "category": "sport"},
    {"article": "14314", "category": "tennis"},
    {"article": "14316", "category": "tennis"},
    {"article": "14316", "category": "sport"},
    {"article": "14316", "category": "accessory"},
  ];

  final list2 = ["sport", "tennis", "accessory"];

  int compareLength = list2.length;

  var outputList = [];
  for (final i in list1) {
    var listCompare = list1.where((element) => element["article"] == i["article"]).toList();
    if(listCompare.length == compareLength){
      outputList = listCompare;
    }
  }
  
  print(outputList);
  
  //output 
  //[{article: 14316, category: tennis}, {article: 14316, category: sport}, {article: 14316, category: accessory}]
}

嘗試這個...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM