React Native按时间值(非键)排序对象列表遇难题,求建议
在React Native中按Firebase对象的time值排序解决方案
嘿,我来帮你搞定这个排序问题!Firebase返回的这种带自动生成ID键的对象结构确实容易让人有点懵,但按值(比如time)排序其实很简单,分两步就能搞定:
第一步:把Firebase对象转换成可排序的数组
Firebase返回的是一个以唯一ID为键的对象,我们需要先把它转换成数组才能使用排序方法。这里有两种常用方式:
方式1:保留Firebase的键(后续更新数据可能需要)
用Object.entries()方法,它会返回一个二维数组,每个元素是[Firebase键, 数据对象]的组合:
const itemsArray = Object.entries(myObject);
方式2:只保留数据对象(不需要键的情况)
用Object.values()方法直接提取所有数据对象组成数组:
const itemsArray = Object.values(myObject);
第二步:按time值排序数组
因为你的time是数字类型的时间戳,直接用数组的sort()方法就能轻松排序。注意:sort()会修改原数组,所以建议先用扩展运算符[...数组]复制一份再排序,避免影响原数据。
情况1:保留Firebase键的数组排序
// 按time降序(最新的内容排在前面) const sortedItems = [...itemsArray].sort((a, b) => b[1].time - a[1].time); // 按time升序(最早的内容排在前面) const sortedItems = [...itemsArray].sort((a, b) => a[1].time - b[1].time);
这里的a[1]和b[1]就是数组元素里对应的数据对象,所以取a[1].time来做比较。
情况2:只保留数据对象的数组排序
// 降序排序 const sortedItems = [...itemsArray].sort((a, b) => b.time - a.time); // 升序排序 const sortedItems = [...itemsArray].sort((a, b) => a.time - b.time);
完整示例
拿你提供的Firebase对象来演示完整流程:
const myObject = { "-LAqmXKSdVVH6wirFa-g": { "desc":"fdf", "price":"rrrr", "receiveHelp":true, "subject":"Single Variable Calculus", "time":1524558865757, "title":"Test1" }, "-LAqmZlBFGoygfTsGQ0e": { "desc":"dsfdsfd3", "price":"333", "receiveHelp":true, "subject":"Single Variable Calculus", "time":1524558900000 } }; // 转数组+按time降序排序+提取数据对象(如果不需要键的话) const sortedItems = Object.entries(myObject) .sort((a, b) => b[1].time - a[1].time) .map(item => item[1]); console.log(sortedItems); // 输出会是time更大的那个对象排在前面
注意事项
如果你的time属性是字符串类型(比如后端存成了字符串),记得先转成数字再比较:
// 字符串类型time的排序示例 const sortedItems = [...itemsArray].sort((a, b) => parseInt(b[1].time) - parseInt(a[1].time) );
内容的提问来源于stack exchange,提问作者gynther
相关产品推荐
相关产品推荐

