首页 > 解决方案 > 为什么我的数组在我的循环中不起作用

问题描述

我有下一个代码...

function feed() {
  var userId = "a";
  var keys = firebase.database().ref('users/' + userId).child("following").once('value').then(function(datakey) {
    let usersPost = {};
    let contador = 0;
    let rangeNumbers = [20, 15, 5];
    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) {
        postdatakey.forEach(function(postdata) {
          //Detecta todos los datos de la publicacion
          let postDB = postdata.val();
          let postId = postDB.id;
          usersPost[contador] = postDB;
          rangeNumbers.push(contador);
          contador++;
        });
      });
    });

    //console.log(usersPost);
    //Randomize here

    var randomi = rangeNumbers;
    randomi = shuffle(randomi);
    console.log(randomi);
  });
}

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;
}

此代码将 1,2,3 添加到我的数组中。我的新数组是 rangeNumbers=[20,15,5,1,2,3]; 但是当我想随机化它时,我的输出是:

15, 20, 5, 1, 2, 3. 我在想这是洗牌功能的问题,但不是问题。

在控制台中我看到: Array(3) [ 5, 20, 15 ]

但是当我打开时,我可以看到我的输出 15、20、5、1、2、3。该函数仅适用于创建的原始数组。

请帮助我我想随机化我的所有数组,而我的代码只随机化前三个数字(原始数组)。

标签: javascriptarraysloops

解决方案


Firebase 代码异步运行,您在回调函数运行之前对数组进行洗牌。您需要将该代码移动到回调函数中。

function feed() {
  var userId = "a";
  var keys = firebase.database().ref('users/' + userId).child("following").once('value').then(function(datakey) {
    let usersPost = {};
    let contador = 0;
    let rangeNumbers = [20, 15, 5];
    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) {
        postdatakey.forEach(function(postdata) {
          //Detecta todos los datos de la publicacion
          let postDB = postdata.val();
          let postId = postDB.id;
          usersPost[contador] = postDB;
          rangeNumbers.push(contador);
          contador++;
        });
        //Randomize here
        var randomi = rangeNumbers;
        randomi = shuffle(randomi);
        console.log(randomi);
      });
    });
  });
}


推荐阅读