我正在尝试按某些元素过滤我的数组。我希望记录类型包含“收入”并且 createdAt 等于一个日期,但是 $0.createdAt!
是一个日期类型,所以我不能使用 .contain("")
,我可以使用什么?
recordFilter = record.filter { $0.recordtype!.contains("Income") /*|| $0.createdAt! = recordItem.createdAt!*/}
recordFilter输出:(这个结果还没有被createdAt过滤)
[<Record: 0x600000099fa0> (entity: Record; id: 0xd0000000003c0000 <x-coredata://913F25A5-B2C9-4646-9091-5EFE7F906908/Record/p15> ; data: {
accountbook = "first book";
amount = "\U00a59.99";
assest = nil;
category = "\U6295\U8d44";
createdAt = "2017-11-16 16:00:00 +0000";
date = nil;
id = 15;
recordtype = "\U6536\U5165";
remark = "";
toAccBook = nil;
}), <Record: 0x600000099ff0> (entity: Record; id: 0xd000000000400000 <x-coredata://913F25A5-B2C9-4646-9091-5EFE7F906908/Record/p16> ; data: {
accountbook = "first book";
amount = "\U00a56.58";
assest = nil;
category = "\U5de5\U8d44";
createdAt = "2017-11-16 16:00:00 +0000";
date = nil;
id = 16;
recordtype = "\U6536\U5165";
remark = "";
toAccBook = nil;
})]
之后,我尝试获取数组中的所有金额字符串并对其求和。但是我发现当我使用这段代码时,它都是单独的字符串,我如何将它分组到数组中并对其求和,或者有任何其他方法可以做到这一点?
let sum = recordFilter.map({Int($0.amount!.dropFirst())})
//[nil, nil]
for i in 0..<recordFilter.count{
if recordFilter[i].amount != nil{
let amountList = recordFilter[i].amount!.dropFirst()
print(amountList) // I found that it's separate string.
//9.99
//11.22
// ...
//let intArray = amountList.map { Int($0)!}
//let sum = amountList.reduce(0, +)
//print(sum)
}
}
最佳答案
好吧,如果你想满足两种情况 (recordtype
== Income
&& createdAt
== Your Date
) 那么为什么不使用 &&
进行过滤?
recordFilter = record.filter { return $0.recordtype!.contains("Income") && $0.createdAt! == recordItem.createdAt!}
请试一试,如果我遗漏了什么,请告诉我?
如果你想在这里求和:
recordFilter.map{($0["amount"] as! Float)}.reduce(0, +)
关于arrays - 如何按多个元素过滤数组并在 Swift 中找到总和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47343382/