处理 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 文档是:

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 数据库获取数据时,您会返回 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 后,您似乎需要执行一些操作:

  1. 从您的组中检索子组。
  2. 遍历子组。
  3. 对于每个子组,检索时间条目。
  4. 根据时间条目的状态是否为 "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"
}
]

希望对您有所帮助!