Ios 如何检查项目是否存在于多个数组中
如果用户选择某个类别,则可以选择将其照片添加到该类别中 类别以水平集合视图的形式显示。如果将照片添加到某个类别中,则“收藏”视图将显示选中标记,指示该照片已添加到特定类别中 用户可以选择编辑他们的照片,如果他们想添加或删除他们的照片从一个类别。我遇到的问题是检查发布的用户是否存在于一个类别中 如果类别中存在postId,则在该集合视图项上显示复选标记 如果类别中不存在postId,则该集合视图项不应具有复选标记 下面是我正在努力解决的一段代码,我如何检查数据库引用中的每个类别,并查看其中是否存在postId 如果postId确实存在,我如何向用户指示特定集合视图项包含postId 在下面的代码示例中,我不确定如何检查所有类别,因此我只选择Ios 如何检查项目是否存在于多个数组中,ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,如果用户选择某个类别,则可以选择将其照片添加到该类别中 类别以水平集合视图的形式显示。如果将照片添加到某个类别中,则“收藏”视图将显示选中标记,指示该照片已添加到特定类别中 用户可以选择编辑他们的照片,如果他们想添加或删除他们的照片从一个类别。我遇到的问题是检查发布的用户是否存在于一个类别中 如果类别中存在postId,则在该集合视图项上显示复选标记 如果类别中不存在postId,则该集合视图项不应具有复选标记 下面是我正在努力解决的一段代码,我如何检查数据库引用中的每个类别,并查看其中是否存在
queryorderdby(byChild:socks)
,因为我知道我在类别中有一个postd
var-trendsCell:TrendsCollectionCell!
guard let post=self.postToEdit else{return}
女性趋势参考queryOrdered(byChild:“socks”).queryEqual(toValue:post.postId)。观察(.value,在
如果snapshot.exists()存在{
self.trendsCell.trendCheckmark.ishiden=false
打印(“在包含postId的单元格项上显示复选标记”)
}否则{
self.trendsCell.trendCheckmark.ishiden=true
打印(“隐藏不包含postId的单元格项上的复选标记”)
}
})
我得到的结果是-当某个集合视图项不应该显示复选标记时,该复选标记将隐藏在该集合视图项上,如果任何类别包含postId,则该特定集合视图单元格应显示该复选标记
这里是json
"female-trend-posts" : {
"socks" : {
"-M1xR6epQQagmJ_bFqH8" : 1
},
"hats" : {
"-M1xR6epQQagmJ_bFqH8" : 1,
"-M11r5zcKvZYHDKhVzKF" : 1,
"shoes" : {
"-M0uaeDL7dD1eFf1tC0k" : 1,
"-M11zGpEBwKtDRp99NOD" : 1
},
postId是M1xR6epQQagmJ_bFqH8如何检查post Id是否存在于袜子、帽子和鞋子中?不仅仅是袜子?我们可以使用递归检查整个json 我们首先将其转换为
[String:Any]
dictionary。从那里,我们检查第一个键是否是值。如果是,我们返回true并完成。如果不是,我们可以递归检查子键以查看它们是否匹配;子键是父值,这就是为什么我们循环使用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"))
}
这可能不是最好的(性能)解决方案,但它确实有效
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])
let dictSocks:Dictionary=[“-M1xR6epQQagmJ_bFqH8”:1]
让dictHats:Dictionary=[“-M1xR6epQQagmJ_bFqH8”:1,“-M11r5zcKvZYHDKhVzKF”:1]
让我们看看字典=[“-m0uaedl7dd1ef1tc0k”:1,“-M11zGpEBwKtDRp99NOD”:1]
func repeatedItems(dicts:[字典]…)->[字符串]{
var allKeys=[String]()
dicts.forEach{(dict)in
福雷赫主教{
所有键+=$0.5键
}
}
设duplicated=Array(Set(allKeys.filter({$0==key}.count>1})中的allKeys.filter({(key:String))中)
重复返回
}
repeatedItems(dicts:[dicts袜子,dicts帽子,dicts鞋子])
您基本上创建了一个函数,在该函数中传递所有字典,将所有键存储在一个[String]
中,然后在数组中查找重复的键。我是作为一个通用算法来做的,不太适合您的实际情况,很抱歉,但我认为它可以帮助您