2013-02-22 58 views
0

說我有在javascript像是否有可能在陣列內部和陣列之間混洗對象?

[[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]] 

數組我可以隨機洗牌子陣的元素,得到這樣的

[[16,4,10],[8,3,9],[1,14,18],[2,5,7],[6,17,11],[12,13,15]] 

編輯:所有的子陣列相同的長度。新的陣列將具有與舊陣列相同長度的子陣列。

+0

你在這裏的邏輯是什麼? – tnanoba 2013-02-22 21:07:07

+0

只是一個隨機洗牌? – 2013-02-22 21:08:01

+0

這只是一個隨機重排,但保持相同的尺寸? – Barmar 2013-02-22 21:08:16

回答

1
function arrayShuffle(){ 
    var tmp, rand; 
    for(var i =0; i < this.length; i++){ 
    rand = Math.floor(Math.random() * this.length); 
    tmp = this[i]; 
    this[i] = this[rand]; 
    this[rand] =tmp; 
    } 
} 

Array.prototype.shuffle =arrayShuffle; 

然後

for(var i in arrays){ 
    arrays[i].shuffle() 
} 

同樣的事情頂層陣列內部陣列位置。

//編輯:Missreading :)

function shuffleAnyNumber (arrays) { 
    var numbers = new Array();  //collection of all numbers 

    for(var i in this){ 
     for(var j in arrays[i]){ 
      numbers.push(arrays[i][j]);  //collect numbers out of the given arrays 
     }  
    } 

    numbers.shuffle(); //Method shown above 

    var output = new Array(); 
    var tempArray= new Array(); 

    //putting it together 
    for(var i in numbers){ 
     if(tempArray.length == 3){ 
      output.push(tempArray); 
      tempArray = new Array(); 
     } else { 
      tempArray.push(numbers[i]); 
     } 
    } 

    return output; 
} 

我會說,它會像那個。

+0

這看起來像只在每個子陣列內洗牌,它不會在子陣列之間洗牌。 – Barmar 2013-02-22 21:11:55

+0

是的,我有點錯過。 但是,這將工作,通過收集所有數字到1陣列,洗牌,並把他們回到陣列的長度爲3. – 2013-02-22 21:13:31

1

你可以扁平化您陣列,shuffle it,然後再拆分起來:

var flat = [].concat.apply([], myArray); 
arrayShuffle(flat); 
var newArray = [], 
    sublen = myArray[0].length; 
for (var i=0; i<flat.length; i+= sublen) 
    newArray.push(flat.slice(i, i+sublen)); 

或者你修改等植物學洗牌算法使用的物品從你的子陣之一。例如,費雪耶茨洗牌:

function shuffle2dArray(array) { 
    if (!array.length) return array; 
    var sublen = array[0].length, 
     len = array.length * sublen; 
    for (var i = len - 1; i > 0; i--) { 
     var j = Math.floor(Math.random() * (i + 1)); 
     var ix = ~~(i/sublen), 
      iy = i % sublen, 
      jx = ~~(j/sublen), 
      jy = j % sublen; 
     var temp = array[ix][iy]; 
     array[ix][iy] = array[jx][jy]; 
     array[jx][jy] = temp; 
    } 
    return array; 
} 
+0

我喜歡第一個解決方案,因爲我已經在我的代碼中展開該數組。 – devcoder 2013-02-22 21:29:20

1

這種慢騰騰的地方,它不會返回一個新的數組:

function shuffleMatrix (m) { 
    if (m.length == 0 || m[0].length == 0) { 
     // no rows or columns, just return it 
     return m; 
    } 
    function swap(i1, j1, i2, j2) { 
     if (i1 != i2 || j1 != j2) { 
      var temp = m[i1][j1]; 
      m[i1][j1] = m[i2][j2]; 
      m[i2][j2] = temp; 
    } 
    var rows = m.length; 
    var cols = m[0].length; 
    for (i = 0; i < rows; i++) { 
     for (j = 0; j < cols; j++) { 
      var new_i = Math.random()*rows; 
      var new_j = Math.random()*cols; 
      swap(i, j, new_i, new_j); 
     } 
    } 
} 
2

我會用強調這個:http://underscorejs.org/

 
v = [[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]] 
v2 = _.shuffle(_.flatten(v)) 
v3 = _.groupBy(v2, function(item, i) { 
    return i % v.length; 
})

0

我100%贊同Ilan Berci的回答。不過,您可以使用下劃線以更實用的風格編寫它:

var v = [[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]]; 

return _(v).chain().flatten().shuffle().groupBy(function(item, i) { 
    return i % v.length; 
}).values().value(); 

Go下劃線!

+0

哦,但s /下劃線/ [lodash](http://lodash.com/) – 2013-02-23 00:46:41

+0

我完全贊同你的功能重寫! :) – 2013-02-23 00:46:44