如何解决Dart:总结地图列表中各项的正确方法是什么?
我正在尝试找出汇总所有相同项目数量的最佳方法,特别是如下所示形成数据:
data = [
{Item Name: Item 2,Quantity: 1},{Item Name: Item 1,{Item Name: Item 3,{Item Name: Item 2,Quantity: 2},];
我想要实现的是:
totalList = [{Item Name: Item 1,Quantity: 3},Quantity: 3}];
我尝试使用 tempData 变量保留元素并比较其余元素,但是,似乎只将第一个与列表的其余部分进行比较。
var tempData = {};
var totalList = [];
data.forEach((element) {
if (tempData.isEmpty) {
tempData = element;
totalList.add(tempData);
} else {
if (tempData['Item Name'] == element['Item Name']) {
tempData['Quantity'] = tempData['Quantity'] + element['Quantity'];
totalList.add(tempData);
} else {
tempData = {
'Item Name': element['Item Name'],'Quantity': element['Quantity']
};
totalList.add(tempData);
}
}
});
以上似乎并没有给我我想要的输出...
我应该怎么做?
谢谢您的帮助。
解决方法
您的数据结构不佳; 'Item Name'
和'Quantity'
标签在结构本身中不是很有用,因此我将摆脱它们,并创建一个简化的Map<String,int>
,将名称直接映射到数量。理想情况下,您可以从那时开始使用简化的结构,但是如果您确实需要显式标签,则可以转换回去。
void main(List<String> args) async {
var data = [
{'Item Name': 'Item 2','Quantity': 1},{'Item Name': 'Item 1',{'Item Name': 'Item 3',{'Item Name': 'Item 2','Quantity': 2},];
// Sum everything into a simpler data structure.
var totalCounts = <String,int>{};
for (var map in data) {
var name = map['Item Name'] as String;
var quantity = map['Quantity'] as int;
totalCounts[name] = (totalCounts[name] ?? 0) + quantity;
}
// Reformat back into the original structure.
var totalList = <Map<String,dynamic>>[
for (var entry in totalCounts.entries)
{'Item Name': entry.key,'Quantity': entry.value},];
// Optional: Sort.
totalList.sort((a,b) => a['Item Name'].compareTo(b['Item Name']));
print(totalList); // Prints: [{Item Name: Item 1,Quantity: 3},{Item Name: Item 2,{Item Name: Item 3,Quantity: 3}]
}
在真实代码中,我还要添加:
const nameLabel = 'Item Name';
const quantityLabel = 'Quantity';
并在各处使用这些字符而不是字符串文字,以减少打字错误的机会。
,我创建了以下解决方案,这些解决方案虽然不那么漂亮,但是可以工作。其概念是创建一个Map<String,Map<String,Object>>
,通过使用每个元素的“项目名称”作为键来跟踪我们已经访问过的元素。
void main() {
final data = [
{'Item Name': 'Item 2',];
final result = [
...data.fold(
<String,Object>>{},(Map<String,Object>> sum,element) => sum
..update(
element['Item Name'] as String,(value) => value
..update('Quantity',(value) => (value as int) + (element['Quantity'] as int)),ifAbsent: () => Map.from(element))).values
];
result.sort(
(a,b) => (a['Item Name'] as String).compareTo(b['Item Name'] as String));
print(result); // [{Item Name: Item 1,Quantity: 3}]
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。