2

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

1
  • Is it possible to create a data model class for this example? Commented Feb 7, 2022 at 2:04

2 Answers 2

1

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);
Sign up to request clarification or add additional context in comments.

2 Comments

i like this answer, maybe you can help me on above question link pls sir
0

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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.