如何制作 List<List<List<String>>> 基于两个 List<Map> dart

How to make List<List<List<String>>> based on two List<Map> dart

我有一个 List<Map> 键值:

              "column-data": [
                {
                  "label": "Title",
                  "align": "right",
                  "width": 50,
                },
                
                {
                  "label": "Description",
                  "align": "left",
                  "width": 100,
                }
              ],

我还有一个 List<Map> :

 "row-data": [
                {
                  "title": "Subscription #1",                
                  "description": "Lorem ipsum dolar set amit."
                },
                {
                  "title": "Subscription #2",
                  "description": "Lorem ipsum dolar set amit."
                }
              ]

我的问题是如何在 labelrow-data 键值的基础上将 column-data 中的键值 alignwidth 添加到 List<List<List<String>>>。我想为每个 row-data 添加来自 column-data 的元数据,如下例所示:

  "row-data" : [
   
   [
     ["Subscription #1", "right", "50"], 
     ["Lorem ipsum dolar set amit.","left", "100"]
   ],
   [
     ["Subscription #2", "right", "50"], 
     ["Lorem ipsum dolar set amit.","left", "100"]
   ]
   
 ];

编辑

实际上 column-data 的地图中的 alignwidth 可能不存在。有没有办法解决这个问题? –

titledescriptionTitleDescription 是动态的,因此可以有不同的键和键值名称。有没有办法不指定这些键和值?

您可以执行基本构成 sql 连接的操作,将每个行项目的条目连接到不同的列并构建您的列表。

const columnData = [
  {
    "label": "Title",
    "align": "right",
    "width": 50,
  },
  {
    "label": "Description",
    "align": "left",
    "width": 100,
  }
];
const rowData = [
  {
    "title": "Subscription #1",                
    "description": "Lorem ipsum dolar set amit."
  },
  {
    "title": "Subscription #2",
    "description": "Lorem ipsum dolar set amit.",
    "something": "or other"
  }
];

final newRowData = rowData.map(
  (r) => r.entries.map(
    (re) {
      final col = columnData.firstWhere(
        (c) => re.key.toUpperCase() == (c['label'] as String).toUpperCase(),
        orElse: () => {}
      );
      return [re.value, ...[
        for (final ce in col.entries)
          if (ce.key != 'label')
            ce.value.toString()
      ]];
    }
  ).toList()
).toList();

您没有显示任何列匹配时会发生什么的示例,因此这只会省略这些部分。

[
  [
    ["Subscription #1", "right", "50"],
    ["Lorem ipsum dolar set amit.", "left", "100"]
  ],
  [
    ["Subscription #2", "right", "50"],
    ["Lorem ipsum dolar set amit.", "left", "100"],
    ["or other"]
  ]
]