javascript - 使 firebase 返回排序后的响应

标签 javascript firebase firebase-realtime-database

我在 Firebase 上有一个数据库。我试图做到这一点,当用户输入一个值时,他们会得到 10 个最接近的建议。这是我到目前为止的查询:

<textarea className='addFriendTextArea' onChange={handleChange} placeholder='Dodaj znajomego'/>

handleChange = async (e) => {
    const {value} = e.target;
    firebase
        .database()
        .ref('Users')
        .orderByChild('nickname')
        .startAt(value)
        .limitToFirst(10)
        .once('value')
        .then(r => arrayFromObject(r.val()))
        .catch(e => console.log(e));
};

这几乎可以工作了。问题是,如果我输入,例如,铁,我会得到:

enter image description here

如果我输入,例如 brunonbane3,这就是我得到的:

enter image description here

所以它们没有排序。我知道我可以使用前端 JavaScript 对它们进行排序,但是有没有办法使用 Firebase 对它们进行排序?

也不应该输入确切的昵称(例如铁),只返回一条记录吗?没有“iron2”类型的帐户。这是怎么回事?

最佳答案

当您对 Firebase 数据库执行查询时,可能会出现多个结果。因此快照包含这些结果的列表。它本质上包含三部分信息:每个匹配子节点的键、每个匹配子节点的值以及匹配子节点的顺序。

当您调用 r.val() 时,您将上面的内容转换为单个 JSON 对象,该对象仅包含键和值。此时,您会失去结果之间的顺序。要保持顺序,请确保使用内置的 DataSnapshot.forEach() 方法循环结果:

.then(snapshot => {
  var result = [];
  snapshot.forEach(child => {
    result.push(child.val());
  })
  return result;
})

关于javascript - 使 firebase 返回排序后的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54292089/

相关文章:

ios - 如何只获取登录用户在 Firebase 中创建的对象?

javascript - 如何映射和减少 Firebase List Observable 的子值

javascript - 如何在 React with Typescript 中使用 Material UI 自定义变体

Javascript-将字典转换为对象列表

javascript - Vue.js 无法检查用户是否已登录计算属性

android - 如何在刷新 token 后恢复主题订阅?

javascript - 线程安全的数组删除

javascript - JSON 是否存在注入(inject)漏洞?

swift - 从 Firebase 检索无值(value)的数据

Android Studio Firebase 数据与 ID 对比