通过特定映射过滤 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 时,请确保您摆脱了 Any
、AnyObject
、NSArray
、NSDictionary
、[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 个结构/数组的主要内容,如果未能解决你的问题,请参考以下文章