【问题标题】:Sort list of Objects react-native by value not key按值而不是键对本机反应的对象列表进行排序
【发布时间】:2018-10-04 20:51:06
【问题描述】:

我在按时间值对 React-native 中的对象列表进行排序时遇到问题。我在网上找不到答案。你有什么建议吗?

我的控制台登录原始对象的 chrome:

Firebase 数据库结构

JSON.stringify(myObject) 输出:

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":1524558875724,"title":"Test2"},"- 
LAqmcipUjlwLWTrRCw4": 
{"desc":"werwerwe55","price":"44","receiveHelp":true,"subject":"Single 
Variable Calculus","time":1524558891956,"title":"Test3"},"- 
LArMeYfHG6QMg_Frn9A": 
{"desc":"3","price":"3","receiveHelp":true,"subject":"Single Variable 
Calculus","time":1524568598762,"title":"Annons 1"},"-LArMjg5MkF5cMPZd_Fz": 
{"desc":"2222","price":"2","receiveHelp":true,"subject":"Single Variable 
 Calculus","time":1524568619782,"title":"Annons2"},"-LArNM-3Ij60XmSOBwvr": 
{"desc":"22","price":"","receiveHelp":true,"subject":"Single Variable 
 Calculus","time":1524568780803,"title":"Hej1"},"-LArNPugIfX1pPVZJ11e": 
{"desc":"f","price":"2","receiveHelp":true,"subject":"Single Variable 
 Calculus","time":1524568796844,"title":"Hej2f"}}

到目前为止我所尝试的:

firebase.database().ref('/users').once('value').then((snapshot) => {
const ads = snapshot.val();
let myObject = {};
Object.keys(ads).map((objectKey) => {
  const value = ads[objectKey];
  myObject = Object.assign(value.ads, myObject);
});

//Here i want to sort myObject by time and get the latest first

console.log(myObject)

【问题讨论】:

  • 你应该在这篇文章中包含你的对象结构和数据,而不是作为外部链接。
  • 您的数据有多个级别,那么您要在哪个级别排序。你的问题解释得不好
  • 我已经打印了 JSON.stringify(myObject) 输出,所以这是我想要排序的输出
  • 您将在每次迭代中覆盖 myObject 值,因此您将如何获得数组或集合。
  • 我应该怎么做而不是覆盖 myObject 来收集所有用户的广告?然后排序?

标签: javascript firebase react-native firebase-realtime-database jsx


【解决方案1】:

您首先需要将广告或所有用户组合到一个数组中,然后进行排序

let sortedAdds = Object.keys(usersData)
.reduce((prev, userId) => {
	let ads = usersData[userId].ads;
  ads = Object.keys(ads).map(key => {
     return { ...ads[key], id: key };
  });
  return prev.concat(ads);
}, [])
.sort((a, b) => (a.time - b.time));

【讨论】:

  • 我试过了,但没有排序。它是否正确? const arrayData = Object.keys(myObject).map(key => { const obj = { ...myObject[key] }; obj.id = key; return obj; }).sort((a, b) => { 返回 a.time - b.time; }); console.log(arrayData);
  • 你能用myObject的部分字符串值更新你的问题吗,比如JSON.stringify(myObject)
【解决方案2】:
([obj1, obj2]).sort((tm1, tm2) => {
  if (tm1.time > tm2.time) {
    return 1;
  }
  if (tm1.time < tm2.time) {
    return -1;
  }
  return 0;
})

【讨论】:

  • 如何将它应用到 myObject?
  • 您是要返回一个新对象还是一个数组?使用Object.keys(myObject),它会给你一个数组。如果您需要一个新对象,则需要在该数组上调用 reduce
  • 所以首先 Object.keys(myObject) 。然后 (myObject.sort((tm1, tm2) => { .... ?
  • Object.keys(myObject).sort(...
【解决方案3】:

您可以通过执行以下操作来使用 Firebase 数据库的排序功能,而不是在前端进行排序:

var ref = database.ref('users/' + adId + '/ads').orderByChild('time');

如果您随后遍历此查询的结果,则广告将根据时间排序

ref.once('value', function(snapshot) {
    snapshot.forEach(function(childSnapshot) {
        var childData = childSnapshot.val();
        console.log(childData);
    });
});

编辑:如果你想要“最新的优先”,我理解为“最新的应该是第一个”,那么你应该存储 time*(-1) 而不是 timetime 是毫秒从unix时代开始,如您的问题所示)

【讨论】:

  • 我所说的 adId 实际上是一组广告的父级的 Id,即您的图像中的 mRVppiPwL1....。你应该知道它,因为你正在查询它的一组孩子
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-27
  • 1970-01-01
  • 2019-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多