arrays - 如何根据另一个值列表从地图列表中提取值
问题描述
我有一张地图清单:
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"];
感谢任何帮助。先感谢您。
解决方案
我将首先反转您的数据结构,这样您就可以拥有一个类别到一个文章 ID,而不是每个都有一个文章 ID 和一个类别的a List
of s 。(实际上, a of 类别比 a 更容易匹配。)Map
Map
Map
List
Set
List
一旦你有了它,你就可以从 中迭代所需的类别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]
推荐阅读
- docker - 如何设置容器名称为计算机名称的容器?
- php - 如果 (is_page_template()) 在 header.php 中不起作用
- java - 您如何为跨包的多个存储库集中一个配置?
- python - 如何使用 Django 文件存储在 API 和 Worker 之间共享文件
- android - 如何实现将文本跟踪到语音,以便显示正在读取的行
- python - 如何将我的输入设置为 Python 中已经存在的变量?
- jquery - 在现有项目中实施引导选择
- node.js - 包含箭头函数捕获“this”的全局值
- php - 比较两个 DateTime 对象的 PHP 性能负载
- c# - 如何调试 UWP 应用的后台服务(IBackgroundTask)?