Flutter数组格式转换:将键对应同长度数组重组为对象数组
Flutter 数组按索引重组转换方案
你需要的格式转换完全可以实现,核心逻辑是利用三个子数组索引一一对应的关系,按索引位置取值重组为单对象,最终收集为目标列表。
源数据与目标格式说明
- 源数据是长度为1的数组,内部包裹三个等长的数值数组,分别对应
timeNameID、alarmIDAdzan、alarmIDIqamah三个属性 - 目标格式是长度和子数组一致的对象数组,每个对象对应三个子数组同索引位置的值,且数值转为字符串类型
源数据示例:
const sourceArray = [ { "timeNameID": [2, 4, 5, 6, 7, 8], "alarmIDAdzan": [4, 5, 5, 5, 5, 5], "alarmIDIqamah": [5, 5, 4, 4, 4, 4] } ];
实现代码
// 1. 取出源数组内的属性映射对象 final sourceItem = sourceArray.first; // 2. 取出三个对应的子数组,做类型断言 final timeList = sourceItem['timeNameID'] as List<int>; final adzanList = sourceItem['alarmIDAdzan'] as List<int>; final iqamahList = sourceItem['alarmIDIqamah'] as List<int>; // 3. 安全校验:三个数组长度必须一致,避免索引越界 assert( timeList.length == adzanList.length && adzanList.length == iqamahList.length, '三个属性数组长度不匹配,无法转换' ); // 4. 按索引生成目标数组 final targetArray = List.generate(timeList.length, (index) { return { 'timeNameID': timeList[index].toString(), 'alarmIDAdzan': adzanList[index].toString(), 'alarmIDIqamah': iqamahList[index].toString(), }; });
运行后打印targetArray即可得到你需要的格式:
[ {timeNameID: '2', alarmIDAdzan: '4', alarmIDIqamah: '5'}, {timeNameID: '4', alarmIDAdzan: '5', alarmIDIqamah: '5'}, {timeNameID: '5', alarmIDAdzan: '5', alarmIDIqamah: '4'}, {timeNameID: '6', alarmIDAdzan: '5', alarmIDIqamah: '4'}, {timeNameID: '7', alarmIDAdzan: '5', alarmIDIqamah: '4'}, {timeNameID: '8', alarmIDAdzan: '5', alarmIDIqamah: '4'} ]
原有代码问题说明
你之前编写的makeArray逻辑是直接把三个完整列表作为属性值存入单个对象,没有做按索引拆分重组的步骤,替换为上述生成逻辑即可。如果你的业务中子数组元素本身就是字符串类型,去掉代码里的.toString()转换即可。
内容的提问来源于stack exchange,提问作者HiDayurie Dave
相关产品推荐
相关产品推荐

