Как бы я перебрал все ключи, чтобы получить указанное c дочернее значение? - PullRequest
1 голос
/ 12 апреля 2020

Я пытаюсь перебрать все ключи в «Расписании», чтобы получить значение ключа и Имя тех, которые имеют утвержденное значение «Да».

То есть для следующей структуры JSON:

Timetable

   Pikes_Lane_Primary_School_Bolton_UK
      Approved: Yes
      Name: Pikes Lane Primary School

   Essa_Academy_Bolton_UK
      Approved: No
      Name: Essa Academy

   Ladybridge_High_School_Bolton_UK
      Approved: Yes
      Name: Ladybridge High School

Мой желаемый результат будет:

Pikes_Lane_Primary_School_Bolton_UK
Pikes Lane Primary School
Ladybridge_High_School_Bolton_UK
Ladybridge High School

Это лучшее, что мне удалось сделать за последние несколько часов:

        let schoolDatabase = Database.database().reference().child("Timetable")
        schoolDatabase.observeSingleEvent(of: .value, with: { (snapshot) in
            for child in snapshot.children {
                let schoolID = child as! DataSnapshot
                //print(schoolID.key)
                for grandchild in schoolID.children {
                    let varOne = grandchild as! DataSnapshot
                    print(varOne.key)
                }
            }
        })

Это приносит обратно следующее:

Approved
Name
Approved
Name
Approved
Name

Ответы [ 2 ]

1 голос
/ 12 апреля 2020
    let schoolDatabase = Database.database().reference().child("Timetable")
    schoolDatabase
        .queryOrdered(byChild: "Approved")
        .queryEqual(toValue: "Yes")
        .observeSingleEvent(of: .value, with: { (snapshot) in
            let children = snapshot.children
                .compactMap { $0 as? DataSnapshot }

            children.forEach { tuple in
                print(tuple.key)

                if let tupleDictionary = tuple.value as? [String: Any] {
                    let name = tupleDictionary["Name"] as? String
                    print(name ?? "-")
                }
            }
        }
    )

Или, если вас интересуют только имена (без ключа):

    let schoolDatabase = Database.database().reference().child("Timetable")
    schoolDatabase
        .queryOrdered(byChild: "Approved")
        .queryEqual(toValue: "Yes")
        .observeSingleEvent(of: .value, with: { (snapshot) in
            let children = snapshot.children
                .compactMap { $0 as? DataSnapshot }
                .compactMap { $0?.value as? [String: Any]}
                .compactMap { $0["Name"] as? String }


            children.forEach { name in
                print(name)
            }
        }
    )
0 голосов
/ 12 апреля 2020

Наконец-то добрались до конца!

        let schoolDatabase = Database.database().reference().child("Timetable")
        schoolDatabase.observeSingleEvent(of: .value, with: { (snapshot) in
            for child in snapshot.children {
                let schoolID = child as! DataSnapshot
                let stringApproved = schoolID.childSnapshot(forPath: "Approved").value
                let stringSchoolName = schoolID.childSnapshot(forPath: "Name").value
                if stringApproved as? String == "Yes" {
                    print(schoolID.key)
                    print((stringSchoolName)!)
                    print((stringApproved)!)
                }
            }
        })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...