代码之家  ›  专栏  ›  技术社区  ›  easement

JavaScript-在对象中无序移动对象(随机)[重复]

  •  19
  • easement  · 技术社区  · 14 年前

    我需要从JSON结果中实现一个随机化。

    问题(对象)

    [Object { id="4c6e9a41470b19_96235904",  more...}, 
     Object { id="4c784e6e928868_58699409",  more...}, 
     Object { id="4c6ecd074662c5_02703822",  more...}, 6 more...]
    

    主题(对象)

    [Object { id="3jhf3533279827_23424234",  more...}, 
     Object { id="4634663466cvv5_43235236",  more...}, 
     Object { id="47hf3892735298_08476548",  more...}, 2 more...]
    

    3 回复  |  直到 14 年前
        1
  •  33
  •   Guy Anoop Joshi P    8 年前

    你需要一个 Fisher-Yates-Durstenfeld shuffle :

    var shuffledQuestionArray = shuffle(yourQuestionArray);
    var shuffledTopicArray = shuffle(yourTopicArray);
    
    // ...
    
    function shuffle(sourceArray) {
        for (var i = 0; i < sourceArray.length - 1; i++) {
            var j = i + Math.floor(Math.random() * (sourceArray.length - i));
    
            var temp = sourceArray[j];
            sourceArray[j] = sourceArray[i];
            sourceArray[i] = temp;
        }
        return sourceArray;
    }
    
        2
  •  11
  •   pepkin88    14 年前

    最简单的方法(不是完美的洗牌,但在某些情况下可能更好):

    function randomize(a, b) {
        return Math.random() - 0.5;
    }
    
    yourQuestionArray.sort(randomize);
    yourTopicArray.sort(randomize);
    

    yourQuestionArray.sort(function (a, b) {return Math.random() - 0.5;});
    yourTopicArray.sort(function (a, b) {return Math.random() - 0.5;});
    

    http://jsfiddle.net/dJVHs/ )

        3
  •  7
  •   gnarf    14 年前

    我发现 this post 关于使用 Fisher-Yates algorithm 在JavaScript中洗牌数组。它使用以下功能:

    function fisherYates ( myArray ) {
      var i = myArray.length;
      if ( i == 0 ) return false;
      while ( --i ) {
         var j = Math.floor( Math.random() * ( i + 1 ) );
         var tempi = myArray[i];
         var tempj = myArray[j];
         myArray[i] = tempj;
         myArray[j] = tempi;
       }
    }