通过特定映射过滤 2 个结构/数组

Posted

技术标签:

【中文标题】通过特定映射过滤 2 个结构/数组【英文标题】:Filter 2 struct/ arrays by mapping by specific 【发布时间】:2017-07-17 16:21:21 【问题描述】:

我是使用 swift 3 和 xcode 8.3 的新用户。目前在控制台输出中面临过滤 2 数组/结构的问题,如下所示:

A_List : Optional([117, 115, 18])

B_List : Optional([
    URL = "169.jpeg";
    categories = "A";
    description = "description XXX";
    height = 128;
    id = 1;
    likes = "1.00";
    name = "Cake - Baked";
    price = "13.78";
    width = 128;
, 
    URL = "1622.jpeg";
    categories = "A";
    description = "Baked till golden";
    height = 128;
    id = 15;
    likes = "1.00";
    name = "Croissant";
    price = "3.71";
    width = 128;
, 
    URL = "11.jpeg";
    categories = "A";
    description = "description Crispy.";
    height = 128;
    id = 18;
    likes = "1.00";
    name = "Plain";
    price = "2.65";
    width = 128;
, 
    URL = "1622.jpeg";
    categories = "A";
    description = "A ";
    height = 128;
    id = 103;
    likes = "1.00";
    name = "America Pie";
    price = "2.12";
    width = 128;
, 
    URL = "11.jpeg";
    categories = "B";
    description = "Puff";
    height = 128;
    id = 115;
    likes = "1.00";
    name = "Puff";
    price = "2.12";
    width = 128;
, 
    URL = "168.jpeg";
    categories = "C";
    description = "description YYY";
    height = 128;
    id = 117;
    likes = "1.00";
    name = "Normal";
    price = "3.18";
    width = 128;
])

我想将 B_List 完整信息返回为 var filtered_List = [AnyObject](),其中仅包含 A_List id 编号 117, 115, and 18,如下所示:

filtered_List : Optional([
        URL = "11.jpeg";
        categories = "A";
        description = "description Crispy.";
        height = 128;
        id = 18;
        likes = "1.00";
        name = "Plain";
        price = "2.65";
        width = 128;
    , 
        URL = "11.jpeg";
        categories = "B";
        description = "Puff";
        height = 128;
        id = 115;
        likes = "1.00";
        name = "Mini Puff";
        price = "2.12";
        width = 128;
    , 
        URL = "168.jpeg";
        categories = "C";
        description = "description YYY";
        height = 128;
        id = 117;
        likes = "1.00";
        name = "Normal";
        price = "3.18";
        width = 128;
    ])

我尝试了一些代码并在 youtube 上阅读了教程,但不幸的是没有找到任何解决方案,并且仅限于 swift2 示例。

目前,我的代码尝试如下:

var filtered_List = [AnyObject]()
let fullrList = B_List?.map$0["id"] as! String.map_ in A_List
filtered_List.append(fullrList as AnyObject )
print("result :\(filtered_List)")

非常感谢专家可以在这里指导或提供您的解决方案。

【问题讨论】:

Swift 约定是使用 lowerCamelCase 作为变量名,而不是 snake_case,绝对不是 Upper_snake_case。此外,您的名称“A 列表”、“B 列表”绝对不会传达有关其内容的信息。我强烈建议你给更好的名字 @Peterhdd 对不是代码的事物使用代码格式,例如版本或技术名称see this meta post @Alexander 感谢您的善意建议。是的,我接受您的评论,并将在我的代码中做得更好。 @Peterhdd 感谢您的更正。赞赏。 @jmattheis,非常感谢您的评论 【参考方案1】:

您应该将所需的 ID 存储在 Set 中,而不是 Array 中。你只需要一个简单的filter 操作:

let desiredIds: Set = [117, 115, 18]

B_List.filter $0["id"].map desiredIds.contains($0)  ?? false  as [AnyObject]

【讨论】:

感谢您的回复。有用!。无论如何,我如何将 A_List 设置为 desiredIds?因为 A_List 会改变。错误显示“无法将类型 '[AnyObject]' 的值转换为指定类型“Set”。 @D_9268 通过Set 初始化程序运行它。 (例如Set(someArray))。为什么A_List 的类型是[AnyObject],而不是[Int] 谢谢。 A_List 是由其他程序从 JSON 格式中过滤出来的。最后我发现 A/B_List 中的所有信息都在字符串中。因此,我也必须确保“id”映射与字符串。 @D_9268 每当您使用 JSON 时,请确保您摆脱了 AnyAnyObjectNSArrayNSDictionary[String: Any] 等的世界。希望尽快到达类型安全的土地 感谢您的建议并指出我的弱点!我将学习更多关于在 Swift 中处理 JSON 内容的教程。【参考方案2】:

感谢所有专门向@Alexander 回复此主题的人。在这里,我分享的解决方案可能不像其他人那样完美。

var resultAnyObject = [AnyObject]()
var aListIds = [String]()

for i in A_List! 
    aListIds.append(i as! String)


//@Alexander : thanks for code below:
let desiredIds = aListIds

let fullList = B_List?.filter $0["id"].mapdesiredIds.contains($0 as! String)  ?? false ;

resultAnyObject.append(fullList as AnyObject)

print("Result of filtered_List :\(resultAnyObject)")

【讨论】:

你只需要A_List as [String],或者map。避免循环使用重复的append 调用

以上是关于通过特定映射过滤 2 个结构/数组的主要内容,如果未能解决你的问题,请参考以下文章

HBase的布隆过滤器

js--数据结构之散列

通过 Alamofire Object Mapper Swift 从映射数组中获取值

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

映射两个对象数组,匹配属性并将特定信息存储在新数组中

根据差异过滤数据帧有两个系列,一个通过字典映射