问题描述
我正在尝试为此CustomDataModel数组中的每个相似的“ x”值减少“ y”值分量,并返回一个CustomDataModel数组(或只是一个元组[(Double,Double)]的数组。
我对Swift的了解充其量只是基本知识,而按以下方式使用链接函数的尝试会在整个数组中减少,而不是按“ x”值减少。我不确定如何将reduce函数限制为仅相似的值。
let reducedArray = yValues.filter( {$0.x == $0.x}).map({$0.y}).reduce(0,+)
以上函数减少了每个x的所有y值。 下面是一个模型和一些虚拟数据:
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),y: 12.5),y: 14.5),y: 18.45),CustomDataModel(x: 5.0,y: 11.4),y: 9.4),y: 18.4),CustomDataModel(x: 9.0,y: 7.6),y: 13.5),y: 18.5),y: 17.6),y: 14.3),CustomDataModel(x: 14.0,y: 19.6),y: 17.8),y: 20.1),y: 21.5),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({ $0.map(\.y).reduce(0,+) })
print(reducedArray)
更新:如果您要求结果为[(Double,Double)]
格式,则可以将上述结果映射到元组。