代码之家  ›  专栏  ›  技术社区  ›  Alex Ironside

使firebase返回已排序的响应

  •  0
  • Alex Ironside  · 技术社区  · 6 年前

    我在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对其进行排序?

    同样,不应该输入准确的刻痕,例如Iron,只返回一条记录吗?没有“Iron2”类型的帐户。这是怎么回事?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Frank van Puffelen    6 年前

    对FireBase数据库执行查询时,可能会有多个结果。所以快照包含这些结果的列表。它基本上包含三条信息:每个匹配子节点的键、每个匹配子节点的值以及匹配子节点的顺序。

    当你打电话 r.val() 您将把上面的内容转换成一个单独的JSON对象,它只为键和值提供位置。此时,您将失去结果之间的顺序。要保持顺序,请确保使用内置的 DataSnapshot.forEach() 方法:

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