[英]Extract unique list of values in one column based on list of values in another column
[英]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"];
感謝任何幫助。 先感謝您。
我會首先反轉你的數據結構,這樣你就沒有一個Map
的List
,其中每個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.