Как преобразовать данные карты в настраиваемый список (вложенный, рекурсивный)? - PullRequest
0 голосов
/ 28 мая 2020

Я хочу преобразовать ....
From: Convert Map (String, Dynami c)
To: Entry (String title, List children )

объект карты:

Map<String, dynamic> mapData = {
  "A": {
        "B": {
               "C": 
                  {
                    "data1": "some data1",
                    "data2": "some data2",
                    "data3": "some data3",
                    "data4": "some data 4"  
                  }
             }
  },
  .......  
};
]

data = generateRecursiveList (mapData);

// Мне нужны данные в соответствии с объектом вывода

List<Entry> finalList = new List<Entry>();


List<Entry> generateRecursiveList(Map group){
var keylist = group.keys.toList();
var valueslist = group.values.toList();

for(int i=0; i<keylist.length;i++){
  Entry entry = new Entry();
  entry.title = keylist[i].toString();
  List<Entry> childEntries = new List<Entry>(); 
  for(int j=0; i<valueslist[j].length;j++){
     if(valueslist[j] is Map){
       childEntries.add(generateRecursiveList(valueslist[j]));  // Recursive calling the same function to get the children
    // I am not sure how i will get this children now
    entry.children = childEntries;
     }    
  }
// This is also I am not sure how to add the entries
   finalEntries.add(entry);
}
}

выходной объект:

final List<Entry> data = <Entry>[
  Entry( 'A', <Entry>[
    Entry( 'B',<Entry>[
         Entry( 'C',<Entry>[
                     Entry( 'some data 1'), 
                     Entry( 'some data 2'),
                     Entry( 'some data 3'),
                     Entry( 'some data 4')
                    ])
          ])
    ]), 
  ....
];

Я попытался написать рекурсивную функцию, но не смог преобразовать эти вложенные карты в список.

1 Ответ

0 голосов
/ 28 мая 2020

Вы можете сделать что-то вроде этого:

class Entry {
  Entry({this.title, this.children});

  String title;
  List<Entry> children;
}

List<Entry> fromJson(Map<String, dynamic> json) {
  final keys = json.keys.toList();
  final res = List<Entry>();
  for (final key in keys) {
    final entry = Entry(title: key, children: fromJson(json[key]));
    res.add(entry);
  }
  return res;
}

РЕДАКТИРОВАТЬ: Так как Dart 2.3 , с for collections, fromJson также можно записать так:

List<Entry> fromJson(Map<String, dynamic> json) {
  return [
    for (final key in json.keys)
      Entry(title: key, children: fromJson(json[key]))
  ];
}
...