如何查询并确保返回的值只添加到数组中一次?

Posted

技术标签:

【中文标题】如何查询并确保返回的值只添加到数组中一次?【英文标题】:How do I query and make sure that the value returned is only added to an array once? 【发布时间】:2016-10-10 18:00:23 【问题描述】:

我有一个代码通过palettes 的所有子元素运行,并确定颜色十六进制是否与这些子元素中的任何值匹配。如果匹配,它将从childByAutoID 中提取 URL,然后将其添加到数组中。

databaseRef.child("palettes").queryOrdered(byChild: "top").queryEqual(toValue: text).observeSingleEvent(of: .value, with:  (snapshot) in

            if let snapDict = snapshot.value as? [String:AnyObject]

                for each in snapDict as [String:AnyObject]

                    let _URL = each.value["URL"] as! String
                    self.arrayVar.append(_URL) // Turning it into an array.

                
            
    )

        databaseRef.child("palettes").queryOrdered(byChild: "bottom").queryEqual(toValue: text).observeSingleEvent(of: .value, with:  (snapshot) in

            if let snapDict = snapshot.value as? [String:AnyObject]

                for each in snapDict as [String:AnyObject]

                    let _URL = each.value["URL"] as! String
                    self.arrayVar.append(_URL) // Turning it into an array.

                
            

        )

        databaseRef.child("palettes").queryOrdered(byChild: "accessories").queryEqual(toValue: text).observeSingleEvent(of: .value, with:  (snapshot) in

            if let snapDict = snapshot.value as? [String:AnyObject]

                for each in snapDict as [String:AnyObject]

                    let _URL = each.value["URL"] as! String
                    self.arrayVar.append(_URL) // Turning it into an array.

                
            

        )

        databaseRef.child("palettes").queryOrdered(byChild: "shoes").queryEqual(toValue: text).observeSingleEvent(of: .value, with:  (snapshot) in

            if let snapDict = snapshot.value as? [String:AnyObject]

                for each in snapDict as [String:AnyObject]

                    let _URL = each.value["URL"] as! String
                    self.arrayVar.append(_URL) // Turning it into an array.

                
            
        )
    

但是,这样做的问题是,当同一个childByAutoID 中有两个相似的值时,它会附加两次“URL”。

这是我的 JSON 树的示例:


  "palettes" : 
    "-KTjfdgcwdkF5j3OWOg8" : 
      "URL" : "test1",
      "accessories" : "#000000",
      "bottom" : "#2B676E",
      "shoes" : "#000000",
      "top" : "#274E64"
    ,
    "-KTji_7xUNu2PejD4Xz6" : 
      "URL" : "test2",
      "accessories" : "#2B6766",
      "bottom" : "#2B676E",
      "shoes" : "#000000",
      "top" : "#274E64"
    
  

#000000 等于text 并且打印arrayVar 时,将返回[test1, test1, test2]

如何确保每个 childByAutoID 只附加一次 URL?例如,在本例中为 [test1, test2]

【问题讨论】:

【参考方案1】:

将您的数组转换为可变字典,然后将您检索到的对象设置为键,并将它们的值设置为布尔值:-

var arrayVar = NSMutableDictionary()
databaseRef.child("palettes").queryOrdered(byChild: "shoes").queryEqual(toValue: text).observeSingleEvent(of: .value, with:  (snapshot) in

        if let snapDict = snapshot.value as? [String:AnyObject]

            for each in snapDict as [String:AnyObject]

                let _URL = each.value["URL"] as! String
                self.arrayVar.setObject(true, forKey: _URL as NSCopying)
            
        
    )

获取您的网址只是:-

 for eachUrl in arrayVar

      let url = eachUrl.key

      

在字典中导航比数组更有效且关联性更高,尤其是在 firebase 中。

【讨论】:

哦,我需要它以数组形式出现的原因是因为我需要使用它来填充集合视图。所以这些 URL 会被翻译成图像,形成一个图像数组,然后再显示在 collectionsView 中 答案已更新...您可以轻松地浏览字典来执行此操作。在遍历整个数组并检查所需的值时,如果它已经存在则浪费内存 谢谢,但我已经通过重组我的 json 树采取了另一种方法。认为我目前的模型太乱了。

以上是关于如何查询并确保返回的值只添加到数组中一次?的主要内容,如果未能解决你的问题,请参考以下文章

如何按列名分组并确保查询检索到最后一次更新

如何在 Django 中一次将多个对象添加到 ManyToMany 关系?

SQL 多选一个字段值只选一次 和多次从表里查询但查的字段较少 相比哪个性能更好?为啥?

如何从表中一次选择相等的值[重复]

如何确保在 Python 中一次只能由一个请求执行一段代码?

在反应jsx中一次遍历一个数组