我正在寻找从Firebase数据库访问嵌套JSON数据以在listView中使用的方法,这是我在整个应用程序中应用的方法,但现在遇到了必须访问具有动态属性的数据子级的麻烦。

从我的数据库中导出我的JSON数据是;

{
    "T&G Canary Wharf" : {
        "Administrator" : {
            "1550633367665" : {
                "date" : "2019-02-12T12:00:00.000",
                "details" : "Full Day",
                "name" : "Edward Lawrence",
                "status" : "pending"
            },
            "1550633370715" : {
                "date" : "2019-02-13T12:00:00.000",
                "details" : "Full Day",
                "name" : "Edward Lawrence",
                "status" : false
            },
            "1550845072137" : {
                "date" : "2019-02-12T12:00:00.000",
                "details" : "Full Day",
                "name" : "Katie Prescott ",
                "status" : 1
            },
        },
        "Stylist" : {
            "1551222170677" : {
            "date" : "2019-02-19T12:00:00.000",
            "details" : "Full Day",
            "name" : "Stylist Stylist",
            "status" : "pending"
      }
    }
  }
}


对于该应用程序的每个用户,始终会设置group(在上面的示例中,T&G Canary Wharf),但是subgroup(在示例中的Administrator&Stylists)对于管理员来说是动态的,这就是我在努力的地方,

我为firebase数据库读取的代码如下:

我正在使用felgo(以前为v-play),其Firebase文档的链接为:

Felgo Firebase Plugin

App {

    property var adminModel: []
    property var groupName //the group name is assigned onLoggedIn, in this example group name === T&G Canary Wharf

    FirebaseDatabase {
        onLoggedIn: {
        firebaseDb.getValue("groups" + "/" + groupName, {
                                orderByValue: true
                            }, function(success, key, value) {
                            if(success){
                            console.log("ADMIN MODEL: " + JSON.stringify(value))
                            adminModel = value // my array where I intend to push the data too
                            }
                        })
                    }
                }
            }


我一直在阅读;

access/process nested objects, arrays or JSON

(顺便说一句超级有帮助)特别是
如果属性名称是动态的,但我事先不知道该怎么办?

我可以创建两个列表条目,分别为AdministratorStylist(子组,但是其子键也是动态的(创建条目的时间,例如:“ 1550633367665”)),我似乎无法进一步?

要创建此模型,我需要以下代码:

ListPage {
    id: adminPage

    model: Object.keys(adminModel)

delegate: SwipeOptionsContainer {
    id: container

    rightOption:  SwipeButton {
        anchors.fill: parent
        backgroundColor: "red"
        icon: IconType.trash

        onClicked: {
            container.hideOptions()
        }
    }

    SimpleRow {
        id: userRow
        width: parent.width
        text: modelData
        }
    }
}


我的问题是

我该如何创建listView的委托是包含"status" : "pending"的任何对象-使用if (value[i].status === pending) { arr.push({...})}循环在其他区域完成,但是subgroup (Stylist/Administrator)未知,从上面的数据库示例中可以看到2列表元素,但实际上将包含更多带有多个subGroup的元素。

最佳答案

从FireBase执行getValue之后,似乎您需要执行一些操作:


从您的组中检索子组。
遍历子组。
对于每个子组,检索时间条目。
根据时间条目的状态是否为"pending"过滤时间条目。


看来您已经通过Object.keys(adminModel)实现了步骤1。现在,我们将使用for循环(步骤2√)进一步走几步。

var subgroups = Object.keys(adminModel);
for (var i in subgroups) {
    var subgroup = adminModel[subgroups[i]];

    // ...
}


为了方便起见,我们定义了subgroup_obj来存储子组的数据。例如。

"Stylist": {
      "1551222170677" : {
           "date" : "2019-02-19T12:00:00.000",
           "details" : "Full Day",
           "name" : "Stylist Stylist",
           "status" : "pending"
      }
}


然后,我们继续执行步骤3,再次使用Object.keys()检索时间条目,但这一次是在子组上。

var timeEntries = Object.keys(subgroup);


由于Object.keys()返回一个数组,我们可以通过使用filter() array method过滤具有挂起状态的条目来完成步骤4。

var filteredEntries = timeEntries.filter(function(t) { return subgroup[t].status === "pending"; } );


使用较新版本的JS,您可以执行timeEntries.filter(t => subgroup[t].status === "pending"),但是Qt似乎尚未完全支持此功能。

就是这样。 filteredEntries为我们提供了每个子组的时间条目数组(例如[ "1551222170677" ])。

如果需要完整的时间输入对象,则可以使用map array method来获取

var filteredEntries2 = filteredEntries.map(function(t) { return subgroup[t]; });


这给了你一系列对象。所以像

[
{
    date: "2019-02-19T12:00:00.000"
    details: "Full Day"
    name: "Stylist Stylist"
    status: "pending"
}
]


希望这可以帮助!

07-25 23:41
查看更多