通过匹配 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 属性过滤数组的主要内容,如果未能解决你的问题,请参考以下文章

通过数组过滤以匹配文本(jQuery / Javascript)

通过在键和值中搜索部分匹配来过滤数组元素

JavaScript 通过数组过滤并仅基于一个值的匹配返回

按匹配不同数组的属性过滤字典数组

通过特定属性过滤和排列[关闭]

通过搜索嵌套对象属性过滤对象数组