You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 04:15:15