Как проверить, существует ли элемент в нескольких массивах - PullRequest
0 голосов
/ 14 марта 2020

Пользователи могут добавить свою фотографию в категорию, если они ее выберут.

Категории отображаются в виде горизонтального представления коллекции. Если фотография добавлена ​​в категорию, в представлении коллекции появится галочка, указывающая, что фотография добавлена ​​в указанную категорию c.

Пользователи могут редактировать свою фотографию, если они хотят добавить или удалите их фото из категории. Проблема, с которой я сталкиваюсь, заключается в проверке того, существует ли postId пользователей в категории.

Если postId существует в категории, отметьте галочкой этот элемент представления коллекции

Если postId не существует в пределах категории. категория, этот элемент представления коллекции не должен иметь галочки.

Вот фрагмент кода, с которым я борюсь, как я могу проверить каждую категорию в ссылке на базу данных и посмотреть, существует ли postId в любой из них.

И если postId делает существует, как я могу указать пользователю, что указанный c элемент представления коллекции содержит 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, то указанная c ячейка представления коллекции должна отображать флажок

Вот json

 "female-trend-posts" : {
    "socks" : {

      "-M1xR6epQQagmJ_bFqH8" : 1
    },
    "hats" : {
      "-M1xR6epQQagmJ_bFqH8" : 1,
      "-M11r5zcKvZYHDKhVzKF" : 1,

    "shoes" : {
      "-M0uaeDL7dD1eFf1tC0k" : 1,
      "-M11zGpEBwKtDRp99NOD" : 1
    },

Идентификатор записи: M1xR6epQQagmJ_bFqH8 Как проверить, существует ли идентификатор записи в носках, шляпах и туфлях? Не просто носки?

Ответы [ 2 ]

0 голосов
/ 14 марта 2020

Возможно, это не самое лучшее (высокопроизводительное) решение, но оно работает

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], а затем ищет повторные ключи в массиве.

0 голосов
/ 14 марта 2020

Мы можем использовать рекурсию для проверки всего json.

Сначала мы превратим его в словарь [String:Any]. Оттуда мы проверяем, является ли любое из первых keys значением. Если это так, мы возвращаем истину и все готово. Если нет, мы можем рекурсивно проверить ключи детей, чтобы увидеть, совпадают ли они; дети keys являются родителями values, и поэтому мы * l oop через 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"))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...