处理 ListView 的嵌套 JSON 数据
handling nested JSON data for ListView
我希望从 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
(在示例管理员和造型师中)对于管理员来说是动态的,这就是我挣扎的地方,
我的 firebase 数据库读取代码如下:
我正在使用 felgo(以前称为 v-play),link 他们的 firebase 文档是:
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 数据库获取数据时,您会返回 DataSnapshot
,其中包含一个 forEach
方法,您可以使用该方法遍历所有子节点。
所以加载一个组并显示所有项目的名称:
firebase.database().ref("group").once("value").then(function(snapshot) {
snapshot.forEach(function(groupSnapshot) {
groupSnapshot.forEach(function(subgroupSnapshot) {
console.log(subgroupSnapshot.val().name);
})
})
})
从 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()
returns 一个数组,我们可以通过使用 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"
}
]
希望对您有所帮助!
我希望从 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
(在示例管理员和造型师中)对于管理员来说是动态的,这就是我挣扎的地方,
我的 firebase 数据库读取代码如下:
我正在使用 felgo(以前称为 v-play),link 他们的 firebase 文档是:
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 数据库获取数据时,您会返回 DataSnapshot
,其中包含一个 forEach
方法,您可以使用该方法遍历所有子节点。
所以加载一个组并显示所有项目的名称:
firebase.database().ref("group").once("value").then(function(snapshot) {
snapshot.forEach(function(groupSnapshot) {
groupSnapshot.forEach(function(subgroupSnapshot) {
console.log(subgroupSnapshot.val().name);
})
})
})
从 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()
returns 一个数组,我们可以通过使用 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"
}
]
希望对您有所帮助!