我正在寻找从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
(顺便说一句超级有帮助)特别是
如果属性名称是动态的,但我事先不知道该怎么办?
我可以创建两个列表条目,分别为
Administrator
和Stylist
(子组,但是其子键也是动态的(创建条目的时间,例如:“ 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"
}
]
希望这可以帮助!