Underscore [27] : 使用 shuffle

摘要:Underscore 使用 shuffle

今天來介紹 Underscore 其中一個功能 , shuffle , 

 

它能夠返回一個隨機排序的陣列副本 ,  簡單的範例如下 : 

 

_.shuffle([1, 2, 3, 4, 5, 6]);
=> [4, 1, 6, 3, 5, 2]

 

其內部實做使用  Fisher-Yates shuffle 演算法 , 

 

其原始碼如下 :  

 

它會先取出第一個元素 , 並與 n 個元素做交換的動作  , 

 

接下來選第二個元素 , 並與 n - 1 個元素再做交換 , 以此類推

 

_.shuffle = function(obj) {
    var set = obj && obj.length === +obj.length ? obj : _.values(obj);
    var length = set.length;
    var shuffled = Array(length);
    for (var index = 0, rand; index < length; index++) {
      rand = _.random(0, index);
      if (rand !== index) shuffled[index] = shuffled[rand];
      shuffled[rand] = set[index];
    }
    return shuffled;
  };