Arrays Swift过滤器对象数组与另一个对象数组

Arrays Swift过滤器对象数组与另一个对象数组,arrays,swift,filter,Arrays,Swift,Filter,我花了好几天的时间研究如何用另一个对象数组对一个对象数组进行条件过滤 这里缺少适当抽象的功能。。。也许你有一些想法 我有一个给定的对象数组,但更复杂 var ArrA = [{ number: 1, name: "A" }, { number: 2, name: "C" }] 我想对所有匹配对象数组B的id的结果进行归档 var ArrB = [{ id: 1, categorie: "wine" }, { id: 3, categorie: "beer" }, { id:

我花了好几天的时间研究如何用另一个对象数组对一个对象数组进行条件过滤

这里缺少适当抽象的功能。。。也许你有一些想法

我有一个给定的对象数组,但更复杂

var ArrA = [{
 number: 1,
 name: "A"
}, {
 number: 2,
 name: "C"
}]
我想对所有匹配对象数组B的id的结果进行归档

var ArrB = [{
 id: 1,
 categorie: "wine"
}, {
 id: 3,
 categorie: "beer"
}, {
 id: 10,
 categorie: "juice"
}]
在最好的情况下,直接将其与if条件一起移动。。。。但我没办法处理。。。这就是我现在的位置。。。这不起作用

let newArray = ArrA.filter{$0.number == ArrB.... }.
if (newArray.count != 0){
    // Do something
}

是否有一种简单的方法来比较数组中每个对象的一个属性与数组中每个对象的另一个属性

我们来分析一下:您需要所有与arrB id匹配的arrA对象,因此首先您需要将arrB映射到id列表,因为您不需要其他信息

让arrBid=SetarrB.map{$0.id}/[1,3,10]

如下文所述,将其强制转换为Set将为大型阵列提供更好的结果,但这不是强制性的

然后,您只需通过仅保留arrBid包含在arrBid中的对象来过滤第一个arrA:

设arrAFilter=arrA.filter{arrBid.contains$0.number}

[编号:1,名称:A]


瞧,为更快的包含使用一个集合:让arrBid=SetarrB.map{$0.id}。数组的contains为On,集合的contains为O1。你不需要在映射和过滤器闭包中返回。@vacawama我知道,如果闭包中只有一行,你就不需要它们,虽然我发现它更清晰,但可能不是每个人都需要它们。这很好。。它就像一个符咒!非常感谢。我真的在琢磨如何从我的对象中获得单个属性数组:。。。有没有可能我也可以将筛选器与if语句结合起来?@Bliv_Dev您可以让arrAFilter=arrA.filter{SetarrB.map{$0.id}。包含$0.number},但我建议您不要这样做。原因是,您在过滤器中放置的闭包将为每个元素触发,因此它将计算arrA中每个元素的映射,这根本不是最优的。顺便说一句,这称为两个数组的交集。