【问题标题】:Filter array by matching id properties通过匹配 id 属性过滤数组
【发布时间】:2026-02-02 08:00:02
【问题描述】:

我觉得这个问题必须在某个地方得到回答,但我一直在寻找几天没有运气。我有一个下面的例子。我有一组用户,我需要将它们过滤到具有匹配 ID 属性的用户,我知道下面的代码无法编译.. 非常感谢您提供任何帮助。

    struct User {
    var id: Int
    var name: String
}

let userArray = [
    User(id: 1, name: "A"),
    User(id: 2, name: "B"),
    User(id: 1, name: "C"),
    User(id: 3, name: "D"),
]


let newArray = userArray.filter({ $0.id == $1.id })


//  This is what i want to achieve 
// newArray = [User(id: 1, name: "A"),  User(id: 1, name: "C")]

在实际项目中,id是动态返回的。所以我只需要能够检查匹配的内容,而不知道实际的 id 是什么。

【问题讨论】:

  • 卢卡斯的回答有点回答你的问题,但那是因为你的问题不清楚。你的目标是什么?是为了隔离任何具有相同 id 的用户吗?如果是这样,如果您有两个 id == 1 的用户和三个 id == 2 的用户会发生什么?你想怎么处理?
  • @flanker 谢谢,好的,它在集合视图单元格中返回,因此每次循环时都应该为每个单元格创建一个不同的实例。我需要为用户上的每个匹配 id 填充一个数组,然后能够通过它们索引个人

标签: arrays swift


【解决方案1】:

您的方法不起作用,因为过滤器只接受一个动态参数并且一次只处理一项。因此它不能匹配两个单独的数组条目。

您的示例也没有指定如何处理您拥有多个不同 User.id 的情况。此答案假定您希望能够将它们分成单独的数组。

Dictionary 有一个方便的初始化程序,它将为您完成大部分工作并根据定义的属性进行分组。对id 进行分组将为您提供一个字典,其中键是id,值是匹配User 记录的数组。然后,您可以过滤字典以获取一个字典,其中任何id 都有多个用户。

let multiples = Dictionary(grouping: userArray, by: \.id).filter{$0.value.count > 1}

使用您的数据,您最终会得到一个字典:

[1: [User(id: 1, name: "A"), User(id: 1, name: "C")] ]

【讨论】:

  • 非常感谢!这完全是因为,我觉得过滤器不正确,但我不确定还有什么可以实现这一点。
【解决方案2】:

您在过滤器中的条件没有与给定的 id 值进行比较。下面是添加的一个,我称之为matchingId:

struct User {
  var id: Int
  var name: String
}

let userArray = [
  User(id: 1, name: "A"),
  User(id: 2, name: "B"),
  User(id: 1, name: "C"),
  User(id: 3, name: "D"),
]

let matchingId = 1   // or: let matchingId = someFunctionCallReturningAnId()

let result = userArray.filter { $0.id == matchingId }

print(result)

【讨论】:

  • 但是真实世界项目中的id是动态的,我只需要检查是否相同?
  • 然后用函数调用替换let matchingId = 1中的1。重要的是,在您的代码中,您不会与任何东西进行比较。代码中的 $1 甚至无效,因为 filter 闭包只有一个参数(称为 $0),它是数组的当前项。
  • 好的,你能举例说明这个函数的作用吗?
  • 您说,您要过滤的这个值(我称之为matchingId)是动态的。我不知道这是从哪里来的,你知道。它不一定是函数调用,它可以是任何可以分配给 matchingId 并且是 Int 的东西。