【问题标题】:Swift: Get indices of an array of objects filtered by a certain propertySwift:获取由某个属性过滤的对象数组的索引
【发布时间】:2020-05-21 18:27:48
【问题描述】:

我有一个自定义对象数组,将 ID 值作为属性。现在我有另一个选定对象数组(由 ID 选择)。如何通过筛选选定的 ID(第二个数组)来获取第一个数组的索引?

我想避免循环并考虑使用compactMap 或类似的解决方案。

struct MyObject {
    var ID: Int
    var name: String
}

let myObjects = [
    MyObject(ID: 3, name: "AAAA"),
    MyObject(ID: 5, name: "BBBB"),
    MyObject(ID: 12, name: "CCCC"),
    MyObject(ID: 15, name: "DDDD"),
    MyObject(ID: 20, name: "EEEE"),
    MyObject(ID: 21, name: "GGGG"),
    MyObject(ID: 22, name: "HHHH"),
    MyObject(ID: 23, name: "IIII"),
]
let selectedIds = [5, 20, 23]

// How to get an array of indices for selectedIds
// Expected result [1, 4, 7]

【问题讨论】:

    标签: arrays swift


    【解决方案1】:
    myObjects.enumerated()   // Pair-up elements and their offsets
        .filter { selectedIds.contains($0.element.ID) }  // Get the ones you want
        .map { $0.offset }  // Extract the offsets
    

    【讨论】:

    • 这比@vadian myObjects.indices.filter{selectedIds.contains(myObjects[$0].ID)}的回答快还是慢
    • 如果它在您的特定情况下很重要,那么对您的特定情况进行基准测试。正确地进行基准测试非常棘手,您的情况的微小差异可能会显着改变性能。如果这么小的微优化对您的情况很重要,那么有更多的性能方法可以做到这一点,但代价是代码复杂性,以及每次更改编译器时重新测试性能的成本。
    • @Pauli vadian 方法的优势在于它也适用于集合切片。一个枚举偏移量它与一个集合索引不同
    • 没错;您必须将其替换为 zip(myObjects.indices, myObjects) 才能在非数组中获得相同的基于索引的行为。 Vadian 的方法也适用于任意集合,这很好。
    • @RobNapier 感谢您提供更多详细信息。我会接受 vadian 的方法,因为它似乎更完整一些,但是因为它工作正常,所以要支持你的方法。谢谢
    【解决方案2】:

    您可以过滤indices

    let selectedIndices = myObjects.indices.filter{selectedIds.contains(myObjects[$0].ID)}
    

    【讨论】:

      猜你喜欢
      • 2021-07-24
      • 2019-06-22
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 2017-12-30
      • 2016-05-22
      • 2016-01-22
      • 2018-01-16
      相关资源
      最近更新 更多