当前位置:  开发笔记 > 编程语言 > 正文

由某些属性组合数组的元素

如何解决《由某些属性组合数组的元素》经验,为你挑选了2个好方法。

我有一个带属性的对象数组date.

我想要的是创建数组数组,其中每个数组将包含具有相同日期的对象.

我明白,我需要像.filter过滤对象一样,然后.map将所有东西添加到数组中.

但是如何告诉.map我需要从过滤对象中为每个组分别使用单独的数组,并且必须将此数组添加到"全局"数组以及如何告诉.filter我需要具有相同日期的对象?



1> golenkovkost..:

它可能会迟到但新的Xcode 9 sdk字典有新的init方法

init(grouping values: S, by keyForValue: (S.Element) throws -> Key) rethrows where Value == [S.Element], S : Sequence

文档具有此方法的简单示例. 我只是发布以下示例:

let students = ["Kofi", "Abena", "Efua", "Kweku", "Akosua"]
let studentsByLetter = Dictionary(grouping: students, by: { $0.first! })

结果将是:

["E": ["Efua"], "K": ["Kofi", "Kweku"], "A": ["Abena", "Akosua"]]



2> Cœur..:

改进oriyentel解决方案以允许对任何事物进行有序分组:

extension Sequence {
    func group(by key: (Iterator.Element) -> GroupingType) -> [[Iterator.Element]] {
        var groups: [GroupingType: [Iterator.Element]] = [:]
        var groupsOrder: [GroupingType] = []
        forEach { element in
            let key = key(element)
            if case nil = groups[key]?.append(element) {
                groups[key] = [element]
                groupsOrder.append(key)
            }
        }
        return groupsOrder.map { groups[$0]! }
    }
}

然后它将适用于任何元组,结构以及任何属性:

let a = [(grouping: 10, content: "a"),
         (grouping: 20, content: "b"),
         (grouping: 10, content: "c")]
print(a.group { $0.grouping })

struct GroupInt {
    var grouping: Int
    var content: String
}
let b = [GroupInt(grouping: 10, content: "a"),
         GroupInt(grouping: 20, content: "b"),
         GroupInt(grouping: 10, content: "c")]
print(b.group { $0.grouping })

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有