代码之家  ›  专栏  ›  技术社区  ›  Jukka

Swift-如何根据条件更改多级JSON结构的单个元素值

  •  0
  • Jukka  · 技术社区  · 2 年前

    我有一个多级结构,可以将复杂的JSON数据转换为结构。我正在努力改变数据结构。组指向presentValue元素值的条件。

    var dataStruct : DataStruct = load("jsonfile.json")
    
     struct DataStruct : Codable {
        let name: String
        var group: [groupData]
    }
    
    struct groupData: Codable, Hashable {
        let id, name : String
        var point : [pointInfo]
    
    }
    
    struct pointInfo : Codable, Hashable {
        let id : String
        let address : address
        let name : String
        var presentValue : String
    }
    
    struct address: Codable, Hashable {
        let index: String
        let type: String
    }
    

    我尝试了下面的map函数,但编译器抱怨ForEach中的组是'let'常量。 基本上,函数应该是比较的 住址指数 结构中的字段传递给 点不 变量,一旦找到它(唯一),就指向。presentValue将更改为新值。

    正确的方法是什么?

       func updatePresentValue(pointNo : String) {
            
            dataStruct.group.forEach { Group in
                Group.point = Group.point.map { point -> pointInfo in
    
                    var p = point
                    if point.address.index == pointNo {
                        p.presentValue = "New value"
                        return p
                    }
                    else { return p }
                }
            }
        }
    
    0 回复  |  直到 2 年前
        1
  •  0
  •   vadian    2 年前

    基本上有两种方法。

    • 通过将对象指定给变量来提取对象,对其进行修改并将其重新指定给对象在中的位置 dataStruct .

    • Enumerate 阵列并在适当的位置修改对象。

    这是第二种方法的一个例子

    func updatePresentValue(pointNo : String) {
        for (groupIndex, group) in dataStruct.group.enumerated() {
            for (pointIndex, point) in group.point.enumerated() {
                if point.address.index == pointNo {
                    dataStruct.group[groupIndex].point[pointIndex].presentValue = "New value"
                }
            }
        }
     }
    
        2
  •  0
  •   Joakim Danielson    2 年前

    在处理多级结构时会变得更加复杂,但这里有一种方法可以在我们首先枚举的地方实现 group 所以每次迭代我们都会得到对象和对象的索引,这样我们可以在更新 大堆内部结构使用 point

    for (index, group) in dataStruct.group.enumerated() {
        if group.point.contains(where: { $0.address.index == pointNo }) {
            var copy = group
            copy.point = group.point.reduce(into: []) {
                if $1.address.index == pointNo {
                    var pointCopy = $1
                    pointCopy.presentValue = "new value"
                    $0.append(pointCopy)
                } else {
                    $0.append($1)
                }
            }
            dataStruct.group[index] = copy
        }
    }