我有一个数组 [modelA,modelB,modelC,modelD,modelE] ,数组中的每个元素都是一个Struct的实例。 Struct有一个属性“name”。例如......
modelA.name = "abc"
modelB.name = "efg"
modelC.name = "hij"
modelD.name = "abc"
modelE.name = "efg"
如何将具有相同属性值的元素分组到新数组中?即将modelA和modelD放入一个新数组,并将modelB和modelE放入另一个数组。
假设原始数组大。
答案 0 :(得分:2)
您可以使用filter(_:):
来实现这一目标返回一个数组,按顺序包含序列的元素 满足给定的谓词。
例如,考虑结构如下:
struct Model {
var name: String?
}
你有一系列模特:
let allModelsArray = [Model(name: "abc"), Model(name: "efg"), Model(name: "hij"), Model(name: "abc"), Model(name: "efg"), Model(name: "efg"), Model(name: "hij")]
因此,您可以通过执行来获取数组(假设您要根据name
的值进行过滤):
let abcModelsArray = allModelsArray.filter { $0.name == "abc" }
// [Model(name: Optional("abc")), Model(name: Optional("abc"))]
let hijModelsArray = allModelsArray.filter { $0.name == "hij" }
// [Model(name: Optional("hij")), Model(name: Optional("hij"))]
ALSO:
你提到过:
如何将具有相同属性值的元素放入新元素中 数组,例如将modelA和modelD放入一个新数组,并放入modelB 和modelE到一个新数组,如果数组很大。
不知何故,您可能想要使用该集合的lazy版本。
希望这会有所帮助。
答案 1 :(得分:2)
我没有对此进行性能测试
struct Model {
var type : String
var name : String
}
var modelA = Model(type: "A", name: "abc")
var modelB = Model(type: "B", name: "efg")
var modelC = Model(type: "C", name: "abc")
var modelD = Model(type: "D", name: "efg")
let models = [modelA,modelB,modelC,modelD]
let names = Set(models.map({return $0.name}))
var groupedModels : [String:[Model]] = [:]
for var name in names {
let elements = models.filter({$0.name == name})
groupedModels[name] = elements
}
答案 2 :(得分:1)
QSerialPort serial;
解决方案:
.reduce
它将返回与@Grimxn响应相同的字典。或者来自let a = [modelA, modelB, modelC, modelD, modelE]
let arr = a.reduce([:]) { (result, currentModel) -> [String: [Model]] in
var mutableDic = result
if ((mutableDic[currentModel.name]) != nil) {
mutableDic[currentModel.name]?.append(currentModel)
} else {
mutableDic[currentModel.name] = [currentModel]
}
return mutableDic
}
for loop
关键是使用Dictionary来跟踪需要放在同一个数组中的Model,与它的var mutableDic = [String : [Model]]()
for aModel in a {
if ((mutableDic[aModel.name]) != nil) {
mutableDic[aModel.name]?.append(aModel)
} else {
mutableDic[aModel.name] = [aModel]
}
}
进行比较。