今天关注的人突然多了起来,为此继续更新今天的第二篇
dart - 如何制作新数组嵌套排序映射?
我有一个看起来像这样的数据块:
var list = [ { id: '1', title: 'thing1', week: 1, day: 1 }, { id: '2', title: 'thing2', week: 1, day: 1 }, { id: '3', title: 'thing3', week: 1, day: 2 }, { id: '4', title: 'thing4', week: 1, day: 2 }, { id: '5', title: 'thing5', week: 1, day: 3 }, { id: '6', title: 'thing6', week: 1, day: 3 }, { id: '7', title: 'thing7', week: 2, day: 4 }, { id: '8', title: 'thing8', week: 2, day: 5 }, ];
我想要做的是将这个 List 转换为输出这个的东西:
var transformedList = [ { 'Week 1': [ { id: '1', title: 'thing1', day: 1, week: 1 }, { id: '2', title: 'thing2', day: 1, week: 1 }, { id: '3', title: 'thing3', day: 2, week: 1 }, { id: '4', title: 'thing4', day: 2, week: 1 }, { id: '5', title: 'thing5', day: 3, week: 1 }, { id: '6', title: 'thing6', day: 3, week: 1 }, ], 'Week 2': [ { id: '7', title: 'thing7', day: 4, week: 2 }, { id: '8', title: 'thing8', day: 5, week: 3 }, ] } ]
到目前为止我尝试过的是:
var programMap = Map.fromIterable(userProgramSteps, key: (k) => k.getWeek(), value: (v) => v); // handles the week port just fine, but very stuck on the list of days.
我对flutter和 Dart 很陌生,所以我有点迷茫…有人可以帮忙吗?
最佳答案
尊重您之前(已删除)的问题,这里的代码:
data_weeks.dart
const week_data = [ { 'id': '1', 'week': 1, 'day': 1, 'title': 'thing1' }, { 'id': '2', 'week': 1, 'day': 1, 'title': 'thing2' }, { 'id': '3', 'week': 1, 'day': 1, 'title': 'thing3' }, { 'id': '4', 'week': 1, 'day': 2, 'title': 'thing4' }, { 'id': '5', 'week': 1, 'day': 2, 'title': 'thing5' }, { 'id': '6', 'week': 2, 'day': 3, 'title': 'thing6' }, { 'id': '7', 'week': 2, 'day': 4, 'title': 'thing7' }, ];
home_page.dart
import 'package:flutter/material.dart'; import 'package:list_cards/src/shared/data_weeks.dart'; class HomePage extends StatelessWidget { /* ---------------------------------------------------------------------------- */ const HomePage({Key key}) : super(key: key); /* ---------------------------------------------------------------------------- */ @override Widget build(BuildContext context) { final data = getNewData(); return Scaffold( appBar: AppBar( title: Text('Hi!'), centerTitle: true, ), body: Padding( padding: const EdgeInsets.all(10.0), child: ListView.builder( itemCount: data.length, itemBuilder: (context, index) => ListTile( title: Text( 'Week ${data.keys.toList()[index]}', style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), ), subtitle: getSubtitles1(data[data.keys.toList()[index]], context), ), ), ), ); } Widget getSubtitles1(List<Map<int, Object>> data, BuildContext context) { return Column( children: List.generate(data.length, (index) => ListTile( title: Text( 'DAY ${data[index].keys.toList()[0]}', style: TextStyle( fontSize: 18, fontWeight: FontWeight.bold, color: Colors.black.withOpacity(0.4) ), ), subtitle: getSubtitles2(data[index][data[index].keys.toList()[0]], context), )), ); } Widget getSubtitles2(List<String> data, BuildContext context) { final size = MediaQuery.of(context).size; return Column( children: List.generate(data.length, (index) => Card( elevation: 0, margin: EdgeInsets.all(0), child: Padding( padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 2), child: Row( children: [ Container( width: (size.width + 80) / 2, child: Text(data[index]), ), IconButton(icon: Icon(Icons.check_box_outline_blank), onPressed: () {}), ], ), ), )), ); } Map<int, Object> getNewData() { var weeks = week_data.map<int>((m) => m['week']).toSet().toList(); var newData = Map<int, Object>(); weeks.forEach((w) { newData[w] = week_data.where((m) => m['week'] == w).map<int>((m) => m['day']).toSet().map<Map<int, Object>>((e) => {e: week_data.where((m) => m['week'] == w && m['day'] == e).map<String>((m) => m['title']).toList()}).toList(); }); return newData; } }
结果: