快速减少元组数组自定义数据模型

问题描述

我正在尝试为此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)]

解决方法

您需要按yValuesx数组分组为Dictionary。并将值映射到y,然后执行reduce。方法如下:

let reducedArray = Dictionary(grouping: yValues,by: \.x).mapValues({ $0.map(\.y).reduce(0,+) })
print(reducedArray)

更新:如果您要求结果为[(Double,Double)]格式,则可以将上述结果映射到元组。