Home > Enterprise >  Flutter merge array if they are duplicated
Flutter merge array if they are duplicated

Time:02-08

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']}]

CodePudding user response:

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);

CodePudding user response:

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.

  •  Tags:  
  • Related