如何检查项目是不是存在于多个数组中
Posted
技术标签:
【中文标题】如何检查项目是不是存在于多个数组中【英文标题】:How to check if item exist within multiple arrays如何检查项目是否存在于多个数组中 【发布时间】:2020-03-14 02:57:35 【问题描述】:如果用户选择了照片,则可以选择将其添加到类别中。
类别以水平集合视图的形式显示。如果将照片添加到类别中,则收藏视图将显示一个复选标记,表示该照片已添加到特定类别中。
如果用户想要在某个类别中添加或删除他们的照片,他们可以选择编辑他们的照片。我遇到的问题是检查用户 postId 是否存在于一个类别中。
如果 postId 存在于某个类别中,则在该集合视图项上显示复选标记
如果类别中不存在 postId,则该集合视图项不应有复选标记。
这是我正在努力解决的一段代码,我如何检查数据库引用中的每个类别,并查看其中是否存在 postId。
如果 postId 确实存在,我如何向用户指示特定的集合视图项包含 postId?
在下面的代码示例中,我不确定如何检查所有类别,因此我只选择了queryOrderedBy(byChild: "socks)
,因为我知道我在该类别中有一个 postId。
var trendsCell: TrendsCollectionCell!
guard let post = self.postToEdit else return
FEMALE_TRENDS_REF.queryOrdered(byChild: "socks").queryEqual(toValue: post.postId).observe(.value, with: (snapshot: DataSnapshot) in
if snapshot.exists()
self.trendsCell.trendCheckmark.isHidden = false
print("Show checkmarks on cell items that contain postId")
else
self.trendsCell.trendCheckmark.isHidden = true
print("Hide checkmark on cell items that do not contain postId")
)
我得到的结果是 - 复选标记隐藏在集合视图项上,但它不应该隐藏,如果任何类别包含 postId,则特定集合视图单元格应该显示复选标记
这是 json
"female-trend-posts" :
"socks" :
"-M1xR6epQQagmJ_bFqH8" : 1
,
"hats" :
"-M1xR6epQQagmJ_bFqH8" : 1,
"-M11r5zcKvZYHDKhVzKF" : 1,
"shoes" :
"-M0uaeDL7dD1eFf1tC0k" : 1,
"-M11zGpEBwKtDRp99NOD" : 1
,
postId 是 M1xR6epQQagmJ_bFqH8 如何检查袜子、帽子和鞋子中是否存在 postId?不只是袜子?
【问题讨论】:
【参考方案1】:我们可以使用递归来检查整个 json。
我们首先把它变成一个[String:Any]
字典。从那里,我们检查第一个 keys
中的任何一个是否是值。如果是这样,我们返回 true 并完成。如果不匹配,我们可以递归检查子键,看它们是否匹配;孩子keys
是父母values
,这就是为什么我们循环遍历dict.values
而不是dict.keys
。
import UIKit
let JSON = """
"female":
"socks" :
"M1xR6epQQagmJ_bFqH8" : 1
,
"hats":
"M1xR6epQQagmJ_bFqH8" : 1,
"M11r5zcKvZYHDKhVzKF" : 1
,
"shoes" :
"M0uaeDL7dD1eFf1tC0k" : 1,
"M11zGpEBwKtDRp99NOD" : 1
"""
let jsonData = JSON.data(using: .utf8)!
print(jsonData)
func checkEntireDictForKey(dict:[String:Any], key:String) -> Bool
let keys = dict.keys
if(keys.contains(key))
return true
else
for value in dict.values
if(value is [String:Any])
return checkEntireDictForKey(dict: value as! [String:Any], key: key)
return false
let json = try JSONSerialization.jsonObject(with: jsonData, options: [])
if let dict = json as? [String: Any]
print(dict)
print(checkEntireDictForKey(dict: dict, key: "M1xR6epQQagmJ_bFqH8"))
【讨论】:
【参考方案2】:这可能不是有史以来最好的(性能)解决方案,但它确实有效
let dictSocks: Dictionary<String, Int> = ["-M1xR6epQQagmJ_bFqH8" : 1]
let dictHats: Dictionary<String, Int> = ["-M1xR6epQQagmJ_bFqH8" : 1, "-M11r5zcKvZYHDKhVzKF" : 1]
let dictShoes: Dictionary<String, Int> = ["-M0uaeDL7dD1eFf1tC0k" : 1, "-M11zGpEBwKtDRp99NOD" : 1]
func repeatedItems(dicts: [Dictionary<String, Int>]...) -> [String]
var allKeys = [String]()
dicts.forEach (dict) in
dict.forEach
allKeys += $0.keys
let duplicated = Array(Set(allKeys.filter( (key: String) in allKeys.filter( $0 == key ).count > 1)))
return duplicated
repeatedItems(dicts: [dictSocks, dictHats, dictShoes])
您基本上创建了一个函数,在其中传递所有字典,将所有键存储在 [String]
中,然后在数组中查找重复的键。
【讨论】:
我把它作为一个通用算法而不是你的真实案例,很抱歉,但我认为它可以帮助你以上是关于如何检查项目是不是存在于多个数组中的主要内容,如果未能解决你的问题,请参考以下文章