Сортировать список объектов реагировать родным по значению, а не ключ - PullRequest
0 голосов
/ 24 апреля 2018

У меня проблемы с сортировкой списка объектов в React-native по значению времени.Я не могу найти ответ в Интернете.Есть ли у вас какие-либо предложения?

Мой консольный журнал в Chrome исходного объекта: My console log in chrome of original object

Структура базы данных Firebase

Firebase database structure

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)

Ответы [ 3 ]

0 голосов
/ 24 апреля 2018

Сначала необходимо объединить объявления или всех пользователей в один массив, а затем отсортировать

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));
0 голосов
/ 24 апреля 2018

Вместо сортировки в своем интерфейсе вы можете использовать возможности сортировки базы данных 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) вместо time (time - это миллисекунды) с эпохи юникса, как показывают в вашем вопросе)

0 голосов
/ 24 апреля 2018
([obj1, obj2]).sort((tm1, tm2) => {
  if (tm1.time > tm2.time) {
    return 1;
  }
  if (tm1.time < tm2.time) {
    return -1;
  }
  return 0;
})
...