【问题标题】:update data in Array of Structs with data in other Array of Struct用其他结构数组中的数据更新结构数组中的数据
【发布时间】:2021-05-05 20:44:10
【问题描述】:

假设我有 struct :

struct Planet {
    var id : UUID
    var name: String
    ...
}

我有一个这样的结构数组,它是根据从数据库中获取的数据构造的。我将其用于浏览器中的表单,用户可以:

  • 编辑字段(例如更改行星名称)
  • 创建一个或多个新行星

此时用户可能不会删除行星,但如果解决方案也支持它会很棒

提交表单后,我得到一个包含这些结构的数组(顺序也与原始的不同)。用第二个数据更新原始数组中的数据的最佳/最有效方法是什么。

我目前的想法是:

  1. 将原始数组映射到 key= id, value= aPlanetStructure 的字典
  2. 循环遍历第二个数组(使用已编辑的数据),如果可以在字典中检索到该“键”(=来自第一个数组的数据)-> 更新那里的结构,如果不能在第一个数组中创建一个额外的星球.

我不确定这是否是一种好方法,似乎有一种更有效的方法(但我想不出)。它也不支持删除行星

【问题讨论】:

  • 你只需要获取你所在星球的索引并更新对应的元素
  • 不幸的是,这并不是那么简单:表单中的订单与数据库中的订单不同(它完全未排序)。 + 如果删除一个索引,索引到索引也会出现问题
  • 如果您还负责后端,您可以发送三个字典deleted/added/modified 以及相应的数据。或者加载整个数据集并使用 diffable 数据源。
  • 当从数据库发送到表单时:没有用,因为用户会更改它,那时我们不知道什么是哪个类别。当从表单发送回来时,我们不能将其拆分为 3 个字典,因为表单是通过 HTML 提交作为一个整体发送的

标签: arrays swift struct


【解决方案1】:

一般来说,如果您可以通过操作将数组的元素分开,您的生活会更轻松。

例如:

var created= [Planet]()
var updated= [Planet]()
var deleted = [Planet]()

在您的 UI 层中,当进行编辑时,将编辑后的星球添加到 更新数组,当一个行星被删除时,将其添加到已删除数组中等等。

使用您的表单提交所有 3 个数组。

遍历每个结果并传递访问数据库的创建、更新和删除方法。

这将需要稍微重构您的表单代码,但是...一般来说,在您的 UI 层中判断某人是在进行创建、更新还是删除比将它们全部混合在一起更容易事后通过比较来弄清楚。

【讨论】:

  • 恐怕这是不可能的,因为 UI 层必须是纯 HTML
  • 纯 HTML... 没有 javascript?
  • 此时没有
  • 然后是的,你被卡住了,就像你建议的阵列一样。除非您的目标是持久化回数据库,在这种情况下,有时您可以让数据库完成繁重的工作。例如,MySQL 允许您像这样进行 UPSERTS:techbeamers.com/mysql-upsert Postgres 像这样:postgresqltutorial.com/postgresql-upsert
  • 这是我的猜测,但问题更多的是这种方法是否是好的蛮力方法......或者在 Swift 中是否有更好的选择。我不是真正的 Swift 专家。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-28
  • 1970-01-01
相关资源
最近更新 更多