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

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

【讨论】:

我把它作为一个通用算法而不是你的真实案例,很抱歉,但我认为它可以帮助你

以上是关于如何检查项目是不是存在于多个数组中的主要内容,如果未能解决你的问题,请参考以下文章

Flutter & Firebase:如何检查某个项目是不是存在于 Firebase 文档中的数组中

如何检查一个值是不是存在于Ruby中的数组中

如何检查是不是存在多个数组键

如何检查数组的元素是不是存在于字符串中

Hive:如何检查一个数组的值是不是存在于另一个数组中?

如何检查 NSDictionary 中的值是不是存在于字典数组中