Reputation: 359
I need to merge arrays that are duplicate
I have data like this
var filterData = [{'date': '25, feb', 'data': ['asd','dsa']}, {'date': '25, feb', 'data': ['asd','dsa']}, {'date': '26, feb', 'data': ['asd','dsa']}]
I want to filter it like [{'date': '25, feb', 'data': ['asd','dsa','asd','dsa']}, {'date': '26, feb', 'data': ['asd','dsa']}]
Upvotes: 2
Views: 876
Reputation: 63864
The filterData
datatype is List<Map<String, dynamic>>
, this dynamic
satisfy String
and List<String>
.
filterData
and result data type => List<Map<String, dynamic>>
List<Map<String, String>> + List<Map<String, List<String>>>
Let's take help from Map
to have a unique date. Now we are going to create a map, then we will convert to list.
Run on dartPad.
Map<String, List<String>> result = {};
for (final data in filterData) {
/// assume filterData will never cause null
final String key = data['date'];
final List<String> value = data['data'];
// just append map value
if (result.containsKey(key)) {
result[key] = [...value, ...value];
;
} else {
//init key-value
result.putIfAbsent(key, () => value);
}
}
//* Current State of result: {25, feb: [asd, dsa, asd, dsa], 26, feb: [asd, dsa]}
//convert map to list
List<Map<String, dynamic>> formatedListResult = result.entries
.map(
(e) => {
'date': e.key,
'data': e.value,
},
)
.toList();
print(formatedListResult);
Upvotes: 1
Reputation: 5718
You could create a model class mainly for getting type safety and equality checks ==
. The latter is needed so a Set cand know when two objects are equals.
// Feel free to change the class name
class Datum {
final String date;
final List<String> data;
Datum(this.date, this.data);
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is Datum && runtimeType == other.runtimeType && date == other.date && data == other.data;
@override
int get hashCode => date.hashCode ^ data.hashCode;
factory Datum.fromJson(Map<String, dynamic> json) => Datum(
json["date"] as String,
List<String>.from((json["data"] as List).map((x) => '$x')),
);
Map<String, dynamic> toJson() => {
"date": date,
"data": List<dynamic>.from(data.map((x) => x)),
};
}
And then you could use a Set so it does not hold duplicate objects. And by overriding the ==
and hashCode
the Set checks if an two objects are the same.
var filterData = {
Datum.fromJson({'date': '25, feb', 'data': ['asd','dsa']}),
Datum.fromJson({'date': '25, feb', 'data': ['asd','dsa']}),
Datum.fromJson({'date': '26, feb', 'data': ['asd','dsa']})
}
Note that filterData
now is a Set and not a List.
Upvotes: 0