Ios 如何检查项目是否存在于多个数组中

Ios 如何检查项目是否存在于多个数组中,ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,如果用户选择某个类别,则可以选择将其照片添加到该类别中 类别以水平集合视图的形式显示。如果将照片添加到某个类别中,则“收藏”视图将显示选中标记,指示该照片已添加到特定类别中 用户可以选择编辑他们的照片,如果他们想添加或删除他们的照片从一个类别。我遇到的问题是检查发布的用户是否存在于一个类别中 如果类别中存在postId,则在该集合视图项上显示复选标记 如果类别中不存在postId,则该集合视图项不应具有复选标记 下面是我正在努力解决的一段代码,我如何检查数据库引用中的每个类别,并查看其中是否存在

如果用户选择某个类别,则可以选择将其照片添加到该类别中

类别以水平集合视图的形式显示。如果将照片添加到某个类别中,则“收藏”视图将显示选中标记,指示该照片已添加到特定类别中

用户可以选择编辑他们的照片,如果他们想添加或删除他们的照片从一个类别。我遇到的问题是检查发布的用户是否存在于一个类别中

如果类别中存在postId,则在该集合视图项上显示复选标记

如果类别中不存在postId,则该集合视图项不应具有复选标记

下面是我正在努力解决的一段代码,我如何检查数据库引用中的每个类别,并查看其中是否存在postId

如果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]
中,然后在数组中查找重复的键。

我是作为一个通用算法来做的,不太适合您的实际情况,很抱歉,但我认为它可以帮助您