简体   繁体   中英

How can I sort posts in an shuffle mode in firebase, without repeat?

I want to show a list of the posts from a user following list. I can show it in the default order, but I want to show it in a shuffle order. I was using a function called shuffle, that works, but in my code doesn't work correctly, because repeat many posts. My code is this:

function feed(){
var postList = document.getElementById('postList');
var userId = "a";

let rangeNumbers=[];

var keys = firebase.database().ref('users/'+userId).child("following").once('value').then(function(datakey){

        let usersPost = [];
    let usersPostProfile = [];
        var contador = 0;
    let htmlPost = "";
        var i = 0;

        datakey.forEach(function(data){

            let userDB = data.val();
            let userIdFollowing = userDB.id;

            firebase.database().ref('posts/').orderByChild("id").equalTo(userIdFollowing).once('value').then(function(postdatakey){

              let cantidad = postdatakey.numChildren();


         postdatakey.forEach(function(postdata){

            //Detecta todos los datos de la publicacion
            let postDB = postdata.val();
            let postId = postDB.id;



      firebase.database().ref('/users/' + postId).once('value').then(function(snapshot) {
  let username = (snapshot.val() && snapshot.val().username);
  let name = (snapshot.val() && snapshot.val().name);
  let image = (snapshot.val() && snapshot.val().image);

  // ...
let newArray = {
            text: postDB.text,
            image: postDB.image,
            imageProfile: image,
            username: username,
            name: name,
            timestamp: postDB.timestamp
      };

 usersPost.push(newArray);

 htmlPost += 
      '<div class="postItem">'
      +'<br>'
    +'<img class="post-img-profile" src="'+usersPost[i].imageProfile+'">'
    +'<div class="userData">'

      +'<a><b>'+usersPost[i].name+'</b></a><br>'
      +'<a>'+usersPost[i].username+'</a>'
      +'</div>'
      +'<br><br><Br><br>'
      +'<div class="post">'
      +'<p>'+usersPost[i].text+'</p>'

      +'<div class="center-content">'
        +'<img class="imagePostBig" src="'+usersPost[i].image+'">'
      +'</div>'

    +'</div>'

    +'<div class="optionPost">'
      +'<img class="post-icon" src="https://img.icons8.com/ios/50/000000/like.png">'
    +'<img class="post-icon" src="https://img.icons8.com/ios/50/000000/comments.png">'
    +'<div class="line"></div>'
    +'</div>'



  +'</div>';

        //console.log(htmlPost);

        postList.innerHTML = htmlPost;

i++
      });


         });



            });  



                            });



    });  



}

function shuffle(array) {
  var currentIndex = array.length, temporaryValue, randomIndex;

  // While there remain elements to shuffle...
  while (0 !== currentIndex) {

    // Pick a remaining element...
    randomIndex = Math.floor(Math.random() * currentIndex);
    currentIndex -= 1;

    // And swap it with the current element.
    temporaryValue = array[currentIndex];
    array[currentIndex] = array[randomIndex];
    array[randomIndex] = temporaryValue;
  }

  return array;
}



feed();

I was using the shuffle function but it repeat the posts. Can you help me please? How can I show this post in a shuffle order?

It's hard to tell since I can't run it and you never actually call shuffle in the code you posted but it looks to me like you just need to call shuffle in the right place.

On the line before

postdatakey.forEach(function(postdata){

add

shuffle(postdatakey);

to randomize the order of the posts.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM