Как объединить два массива во Flutter?

var list = [
    {"docNo": "2023-12", "objName": "img1"},
    {"docNo": "2023-12", "objName": "img2"},
    {"docNo": "2022-10", "objName": "img3"},
    {"docNo": "2022-08", "objName": "img4"},
  ];

Учитывая массив, подобный приведенному выше, я хочу объединить объект с тем же docNo с другим значением ObjName

Ожидаемый результат:

var list = [
    {"docNo": "2023-12"", "objName": ["img1", "img2"]},
    {"docNo": "2022-10", "objName": "img3"},
    {"docNo": "2022-08", "objName": "img4"},
  ];
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
2
0
61
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я уверен, что есть лучшие и более простые способы, но они должны дать вам желаемые результаты.

Это решается путем сохранения значений ключей отдельно в списке, их сравнения и объединения. Если вы столкнетесь с более кратким и лучшим кодом, пожалуйста, поделитесь!

import 'dart:core';

var list = [
    {"docNo": "2023-12", "objName": "img1"},
    {"docNo": "2023-12", "objName": "img2"},
    {"docNo": "2022-10", "objName": "img3"},
    {"docNo": "2022-08", "objName": "img4"},
  ];

void main(){
  List<String> temp = [];
  
  List<Map<String, dynamic>> result = [];
  
  for(int i=0; i<list.length; i++){
    temp.add(list[i]["docNo"]!);
  }
  var keys = temp.toSet().toList();
  List values = [];
  
  for(int i=0; i<keys.length; i++){
   
    for(int j=0; j<list.length; j++){
      if (keys[i].toString() == list[j]["docNo"]!.toString()){
        values.add(list[j]["objName"]!);
      } 
    }
    result.add(
      {
        "docNo" : keys[i], 
        "objName" : values.toList(),
      }
    );
    values.clear();
  }
  
  print(result);
//[{docNo: 2023-12, objName: [img1, img2]}, 
//{docNo: 2022-10, objName: [img3]},
//{docNo: 2022-08, objName: [img4]}]
 
}
Ответ принят как подходящий

Вот альтернатива:

  import 'package:collection/collection.dart';

  var list = [
    {"docNo": "2023-12", "objName": "img1"},
    {"docNo": "2023-12", "objName": "img2"},
    {"docNo": "2022-10", "objName": "img3"},
    {"docNo": "2022-08", "objName": "img4"},
  ];

  var newObjects = <Map<String, dynamic>>[];
  groupBy(list, (p0) => p0['docNo']).values.forEach(
        (groupList) => newObjects.add({
          'docNo': groupList.first['docNo'],
          'objName': groupList.map((e) => e['objName']).toList(),
        }),
  );
  print(newObjects)

Будет печатать:

[{docNo: 2023-12, objName: [img1, img2]}, {docNo: 2022-10, objName: [img3]}, {docNo: 2022-08, objName: [img4]}]

Очень простой подход:

void main() {
  final list = [
    {'docNo': '2023-12', 'objName': 'img1'},
    {'docNo': '2023-12', 'objName': 'img2'},
    {'docNo': '2022-10', 'objName': 'img3'},
    {'docNo': '2022-08', 'objName': 'img4'},
  ];

  // collects all doc numbers in a set, so you can group by them
  final docNos = list.map((entry) => entry['docNo']).toSet();

  // builds a result list, containing a map for each docNo
  final result = <Map<String, dynamic>>[];
  for (final docNo in docNos) {
    result.add({
      'docNo': docNo,
      'objName': list
          .where((element) => element['docNo'] == docNo)
          .map((docEntry) => docEntry['objName'])
          .toList()
    });
  }

  print(result);
}

Однако есть одно отличие. Это решение всегда собирает элементы objName в список, даже если для docNo есть только одна запись.

Другие вопросы по теме