我有一个如下所示的数组:
[{name: Cibo, quantity: 3},
{name: Cibo, quantity: 2},
{name: Invia Regalo, quantity: 3},
{name: Invia Regalo, quantity: 1}]
如何通过组合相同的名称找到这些对象的总数?
所以输出看起来像:
[
{name: Invia Regalo, quantity: 4},
{name: Cibo, quantity: 5},
]
我尝试过类似的方法,但在 Dart 中不起作用。
var categoryTotal = [];
category.forEach((category) {
print(category);
var categ =
categoryTotal.firstWhere((cat) => cat['name'] == category['name']);
print("Category is $categ");
if (categ != null) {
categ['quantity'] += category['quantity'];
} else {
categoryTotal.add(category);
}
});
print(categoryTotal);
答案 0 :(得分:1)
我一般不推荐使用映射映射来处理包含不同类型值的对象。相反,使用类。它使编写类型安全的代码变得更加容易。
此外,当您有多行代码时,我不建议使用 .forEach()
方法,因为它会使阅读变得困难。相反,请使用 for-each 循环。
我制定了以下解决方案来处理您的地图列表。 sumMap
用于通过使用 Map
处理 quantity
的总和来提高代码效率。然后根据 sumMap
:
void main() {
final array = [
{'name': 'Cibo', 'quantity': 3},
{'name': 'Cibo', 'quantity': 2},
{'name': 'Invia Regalo', 'quantity': 3},
{'name': 'Invia Regalo', 'quantity': 1},
];
final sumMap = <String, int>{};
for (final map in array) {
sumMap.update(
map['name']! as String,
(sum) => sum + (map['quantity']! as int),
ifAbsent: () => map['quantity']! as int,
);
}
final result = [
for (final entry in sumMap.entries)
{'name': entry.key, 'quantity': entry.value}
];
print(result);
// [{name: Cibo, quantity: 5}, {name: Invia Regalo, quantity: 4}]
}
答案 1 :(得分:0)
您需要添加 orElse: () => null
以避免例外。因此,最终代码将如下所示:
var categoryTotal = [];
category.forEach((category) {
var categ = categoryTotal.firstWhere(
(cat) => cat['name'] == category['name'],
orElse: () => null,
);
if (categ != null) {
categ['quantity'] += category['quantity'];
} else {
categoryTotal.add(category);
}
});
print(categoryTotal);