从数组中分组具有相同属性值的元素

时间:2017-01-18 08:22:01

标签: ios arrays swift

我有一个数组 [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放入另一个数组

假设原始数组

3 个答案:

答案 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] } } 进行比较。