0

我正在寻找从 firebase 数据库访问嵌套 JSON 数据以在 a 中使用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),他们的 firebase 文档的链接是:

Felgo 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                              
                            }
                        })
                    }
                }
            }

我一直在阅读;

访问/处理嵌套对象、数组或 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的。

4

2 回答 2

1

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

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

看起来您已经使用Object.keys(adminModel). 现在我们将通过 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()数组方法过滤具有待处理状态的条目来完成第 4 步。

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

使用较新版本的 JS,您可以这样做timeEntries.filter(t => subgroup[t].status === "pending"),但这似乎还没有得到 Qt 的完全支持。

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

如果你想要完整的时间条目对象,你可以使用map数组方法来获取

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

它为您提供了一组对象。所以像

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

希望这可以帮助!

于 2019-03-03T16:48:31.750 回答
0

当您从 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);
    })
  })
})
于 2019-02-28T03:43:36.973 回答