2017-03-02 30 views
2

我有此类:减少对象的数组基于在共同的值可变夫特3

class Post { 
    var key: String 
    var uid: String 
    var minutes: Int 
    var name: String 
    let ref: FIRDatabaseReference? 

init(key: String, uid: String, minutes: Int, name: String){ 
    self.key = key 
    self.uid = uid 
    self.minutes = minutes 
    self.name = name 
    self.ref = nil 
} 

使用这个类我已经创建的对象的阵列,虽然我可以总我有麻烦共计分钟只有具有不同uid的元素的分钟。

有人能帮我指出正确的方向吗?

+0

你是什么意思'我有麻烦共计分钟基于uid'你想与具体的用户界面分钟的总和?如果是,请在您的问题中添加相关细节。 –

+0

是的,一个数组可以具有相同的uid,我希望每个唯一uid实例的总分钟数,以便最终每个唯一uid具有总分钟数。我会更新原文。谢谢! – Anno

+0

您尚未更新您的问题? –

回答

1

编辑

我原来的答复错过了你的问题似乎点,这里是什么你想:

let minutes = posts.reduce(([String : Int]())) { accumulator, value in 
    var currentData = accumulator 
    if accumulator.keys.contains(value.uid) { 
     currentData[value.uid] = accumulator[value.uid]! + value.minutes 
     return currentData 
    } else { 
     currentData[value.uid] = value.minutes 
     return currentData 
    } 
} 

这是游乐场代码只有总计唯一的用户ID的分钟:

let posts = [Post(key: "key", uid: "0", minutes: 5, name: "name"), Post(key: "key", uid: "1", minutes: 5, name: "name"), Post(key: "key", uid: "1", minutes: 5, name: "name"), Post(key: "key", uid: "1", minutes: 5, name: "name"), Post(key: "key", uid: "3", minutes: 2, name: "name")] 

let count = posts.reduce((0, [String]())) { accumulator, value in 
    if accumulator.1.contains(value.uid) { 
     return accumulator 
    } else { 
     return (accumulator.0 + value.minutes, accumulator.1 + [value.uid]) 
    } 
    }.0 

减少让你“遍历”您的帖子数组。你从0开始分钟计数,并且一个空的uid数组。如果uid在那里,那么你不会在分钟数上加上任何分钟,并且保持原样。如果没有,则添加分钟并将字符串添加到uid字符串数组。在最后你通过得到的元组的第一个元素(因此.0)

较短的版本是获得分钟数:

let count = posts.reduce((0, [String]())) { 
     return $0.1.contains($1.uid) ? $0 : ($0.0 + $1.minutes, $0.1 + [$1.uid]) 
    }.0 
+0

工作,非常感谢!对此,我真的非常感激。不确定这里是否合适,但是需要快速跟进:如果我现在只想在某些日期范围内合计分钟数,我最好如何将if语句合并到缩减中,以便只查看日期A和日期B之间的帖子? – Anno

+0

没关系我只是在let count语句下添加一个if语句就可以了。再次感谢! – Anno

+0

你可以使用过滤器:minutes.filter {你的条件在这里}。您的条件应该看起来像这样$ 0.date> yourFirstDate && $ 0.date Ocunidee

1

有了新定义的问题,你在找什么会是这样的:

let counts = values.reduce([String:Int]()) { acc, value in 
    var copy = acc 

    copy.updateValue((copy[value.uid] ?? 0) + value.minutes, forKey: value.uid) 

    return copy 
} 
+0

uid是String类型的,所以你应该编辑你的字典类型,我可以删除我的答案。 – Ocunidee