如何在Swift中按条件组合数组中的对象?

时间:2017-07-27 13:59:08

标签: ios arrays swift sorting

我有一个对象数组:

struct Person {
    let name: String
    let dateOfBirth: Date
    let money: Double
}

它包含了人们以及他们收到或花了多少钱。 该数组包含54个这样的对象。 我需要找到具有相同名称和日期字段的所有对象并总结他们的钱。也就是说,最后,我必须在我的阵列中获得少于54条记录。

实施例: 在数组中,对象John有3条记录。例如,首先,他收到15.0美元,然后花了7.0美元,然后收到4.0美元。对于我的任务,我需要在数组中有1条记录而不是3条(有钱作为12.0美元)

有没有人有任何想法?

2 个答案:

答案 0 :(得分:2)

你可以循环遍历数组并将它们添加到字典中,其中与出生日期连接的名称将是关键字,并且钱的总和将是值。

假设包含Person个对象的数组名为people

var moneyDictionary = [String:Double]()
for person in people {
    let personKey = "\(person.name)\(person.dateOfBirth)"
    if let personRecord = moneyDictionary[personKey] {
        moneyDictionary[personKey] = personRecord + person.money
    } else {
        moneyDictionary[personKey] = person.money
    }
}

答案 1 :(得分:0)

也许这样的事情会起作用:

struct Person {
    let name: String
    let dateOfBirth: Date
    let money: Double
}

let currentDate = Date()
let person = Person(name: "James", dateOfBirth: currentDate, money: 15)
let person1 = Person(name: "James", dateOfBirth: currentDate, money: -7)
let person2 = Person(name: "James", dateOfBirth: currentDate, money: 4)

// array of person objects
let personArray = [person, person1, person2]

// selected person
let selectedPerson = person

// filter with selected person only
var matchingPersons = personArray.filter {
    $0.name == selectedPerson.name && $0.dateOfBirth == selectedPerson.dateOfBirth
}

// extract values
var values = matchingPersons.map { $0.money }

// total
var total = values.reduce(0, +)