通过匹配 id 属性过滤数组
Posted
技术标签:
【中文标题】通过匹配 id 属性过滤数组【英文标题】:Filter array by matching id properties 【发布时间】:2022-01-11 05:44:10 【问题描述】:我觉得这个问题必须在某个地方得到回答,但我一直在寻找几天没有运气。我有一个下面的例子。我有一组用户,我需要将它们过滤到具有匹配 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 填充一个数组,然后能够通过它们索引个人 【参考方案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 的东西。以上是关于通过匹配 id 属性过滤数组的主要内容,如果未能解决你的问题,请参考以下文章