'Generate List of total sales for similar date from another list that has repeated days
I have a list of daily sales which includes "DateTime" & "Int" for each entry. The issue with this list is that there are some times multiple entries for the same date.
final data = [
DailySales(2022-03-10 05:25:40.000, 200),
DailySales(2022-03-10 09:10:50.000, 455),
DailySales(2022-03-09 04:70:30.000, 255),
DailySales(2022-03-09 20:10:20.000, 525),
DailySales(2022-02-08 05:60:00.000, 100),
DailySales(2022-02-10 00:00:00.000, 520),
DailySales(2022-01-08 12:10:40.000, 100),
DailySales(2022-01-08 02:30:10.000, 250),
DailySales(2022-01-10 09:20:00.000, 520),
];
class DailySales {
final DateTime day;
final int sales;
DailySales(this.day, this.sales);
}
Now Based on the above list, I need to dynamically generate a new list that combine the sales in one entry if there is multiple entries of similar date. i.e one entry per date and the total sales for that date.
Solution 1:[1]
A basic workaround:
I'll be implementing a simple technique on the sample data from your question.
Your data:
final data = [
DailySales(2022-03-10 00:00:00.000, 200),
DailySales(2022-03-10 00:00:00.000, 455),
DailySales(2022-03-09 00:00:00.000, 255),
DailySales(2022-03-09 00:00:00.000, 525),
DailySales(2022-02-08 00:00:00.000, 100),
DailySales(2022-02-10 00:00:00.000, 520),
DailySales(2022-01-08 00:00:00.000, 100),
DailySales(2022-01-08 00:00:00.000, 250),
DailySales(2022-01-10 00:00:00.000, 520),
];
You need to add all the Objects with same date like:
void processData() {
List<DailySales> processedData = [];
for (var dailySales in data) {
int sales = 0;
final dailyFormat = DateFormat("dd-MM-yyyy").format(dailySales.day);
for (int i = 0; i < data.length; i++) {
final dateFromData = DateFormat("dd-MM-yyyy").format(data[i].day);
if (dateFromData == dailyFormat) {
sales += data[i].sales;
}
}
processedData
.add(DailySales(DateFormat("dd-MM-yyyy").parse(dailyFormat), sales));
}
final Map<DateTime, DailySales> map = {
for (var dailySales in processedData) dailySales.day : dailySales,
};
processedData = map.values.toList();
}
The list named processedData will contain DailySales with one entry for each date.
Update: You need to use intl package for this.
Solution 2:[2]
for(int i=0; i<data.length;i++){
if(finalList.contains(data[i].day) {
final tempSales=finalList.firstWhere((element)=>element.day==data[i].day)
data[i].sales+= tempSales.sales
}
else{
finalList.add(data);
}
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | |
| Solution 2 | Dharman |
