Swift 减少元组数组自定义数据模型
Swift reduce tuple array custom data model
我正在尝试减少此 CustomDataModel 数组中每个类似“x”值的“y”值分量,return一个 CustomDataModel 数组(或只是一个元组数组 [(Double, Double)] .
我对 Swift 的了解充其量只是基本知识,尝试使用如下链接函数会减少整个数组,而不是每个“x”值。我不确定如何将 reduce 函数限制为仅类似的值。
let reducedArray = yValues.filter( {[=11=].x == [=11=].x}).map({[=11=].y}).reduce(0, +)
上述函数减少了所有 y 值而不是每个 x。
下面是模型和一些虚拟数据:
struct CustomDataModel {
var x : Double
var y : Double
}
let yValues: [CustomDataModel] = [
CustomDataModel(x: 0.0, y: 10.0),
CustomDataModel(x: 1.0, y: 5.0),
CustomDataModel(x: 1.0, y: 12.5),
CustomDataModel(x: 1.0, y: 14.5),
CustomDataModel(x: 1.0, y: 18.45),
CustomDataModel(x: 5.0, y: 11.4),
CustomDataModel(x: 5.0, y: 9.4),
CustomDataModel(x: 5.0, y: 18.4),
CustomDataModel(x: 5.0, y: 5.0),
CustomDataModel(x: 9.0, y: 7.6),
CustomDataModel(x: 9.0, y: 13.5),
CustomDataModel(x: 9.0, y: 18.5),
CustomDataModel(x: 9.0, y: 17.6),
CustomDataModel(x: 9.0, y: 14.3),
CustomDataModel(x: 14.0, y: 19.6),
CustomDataModel(x: 14.0, y: 17.8),
CustomDataModel(x: 14.0, y: 20.1),
CustomDataModel(x: 14.0, y: 21.5),
CustomDataModel(x: 14.0, y: 23.4),
]
理想情况下,我的输出应该是这样的:
print(reducedArray)
//[(0.0, 10.0), (1.0, 50.45), (5.0, 44.2), (9.0, 71.5), (14.0, 102.4)]
您需要将 yValues
数组按 x
分组为 Dictionary
。并将值映射到y
,然后执行reduce
。方法如下:
let reducedArray = Dictionary(grouping: yValues, by: \.x).mapValues({ [=10=].map(\.y).reduce(0, +) })
print(reducedArray)
更新:如果您要求结果采用 [(Double, Double)]
格式,您可以将上述结果映射到元组。
我正在尝试减少此 CustomDataModel 数组中每个类似“x”值的“y”值分量,return一个 CustomDataModel 数组(或只是一个元组数组 [(Double, Double)] .
我对 Swift 的了解充其量只是基本知识,尝试使用如下链接函数会减少整个数组,而不是每个“x”值。我不确定如何将 reduce 函数限制为仅类似的值。
let reducedArray = yValues.filter( {[=11=].x == [=11=].x}).map({[=11=].y}).reduce(0, +)
上述函数减少了所有 y 值而不是每个 x。 下面是模型和一些虚拟数据:
struct CustomDataModel {
var x : Double
var y : Double
}
let yValues: [CustomDataModel] = [
CustomDataModel(x: 0.0, y: 10.0),
CustomDataModel(x: 1.0, y: 5.0),
CustomDataModel(x: 1.0, y: 12.5),
CustomDataModel(x: 1.0, y: 14.5),
CustomDataModel(x: 1.0, y: 18.45),
CustomDataModel(x: 5.0, y: 11.4),
CustomDataModel(x: 5.0, y: 9.4),
CustomDataModel(x: 5.0, y: 18.4),
CustomDataModel(x: 5.0, y: 5.0),
CustomDataModel(x: 9.0, y: 7.6),
CustomDataModel(x: 9.0, y: 13.5),
CustomDataModel(x: 9.0, y: 18.5),
CustomDataModel(x: 9.0, y: 17.6),
CustomDataModel(x: 9.0, y: 14.3),
CustomDataModel(x: 14.0, y: 19.6),
CustomDataModel(x: 14.0, y: 17.8),
CustomDataModel(x: 14.0, y: 20.1),
CustomDataModel(x: 14.0, y: 21.5),
CustomDataModel(x: 14.0, y: 23.4),
]
理想情况下,我的输出应该是这样的:
print(reducedArray)
//[(0.0, 10.0), (1.0, 50.45), (5.0, 44.2), (9.0, 71.5), (14.0, 102.4)]
您需要将 yValues
数组按 x
分组为 Dictionary
。并将值映射到y
,然后执行reduce
。方法如下:
let reducedArray = Dictionary(grouping: yValues, by: \.x).mapValues({ [=10=].map(\.y).reduce(0, +) })
print(reducedArray)
更新:如果您要求结果采用 [(Double, Double)]
格式,您可以将上述结果映射到元组。