在Javascript中改组数组

时间:2011-08-13 18:44:11

标签: javascript arrays shuffle

我有两个带有一系列整数的数组。我想模拟反复切割一副牌以“洗牌”。我设置了一个切割位置并将数组A中切割之前的所有内容分配给数组B的开头。我意识到我需要使用切片来避免仅创建对数组A的引用,但是我可以在等式的两边使用切片,即arrayB.slice(0,3) = arrayA.slice(49,52)

4 个答案:

答案 0 :(得分:2)

将任何内容分配给函数的返回值与在示例中一样,没有多大意义。

尝试查看 splice 方法,它应该可以满足您的需求。

示例:

var a = arrayA.splice(0,10); //remove the first 10 elements from arrayA and assign them to a
var b = arrayB.splice(0,10); //see above;
Array.prototype.push.apply(arrayA,b); //add the elements you removed from ArrayB to arrayA
Array.prototype.push.apply(arrayB,a); //see above.

答案 1 :(得分:0)

我不知道重复的扦插是否真的模仿了一个洗牌,但也许并不是你所做的一切。无论如何,根据我对你的描述的理解,你想要:

arrayB = arrayA.splice(49,52).concat( arrayB );

这应该会导致修改后的arrayB具有从arrayA之前移除的部分。

如果您希望修改arrayAarrayB不再包含arrayA,那么您可以使用Array.prototype.slice()代替Array.prototype.splice()

使用splice()

var a = [ 'a1', 'a2', 'a3', 'a4' ];
var b = [ 'b1', 'b2', 'b3', 'b4' ];
b = a.splice( 0, 2 ).concat( b );
// a is now: [ 'a3', 'a4' ]
// b is now: [ 'a1', 'a2', 'b1', 'b2', 'b3', 'b4' ]

在两个阵列上操作以使每个阵列从另一个阵列接收:

var a = [ 'a1', 'a2', 'a3', 'a4' ];
var b = [ 'b1', 'b2', 'b3', 'b4' ];

var removedFromA = a.splice( 0, 2 );
var removedFromB = b.splice( 0, 2 );

b = removedFromA.concat( b );
a = removedFromB.concat( a );

// a is now: [ 'b1', 'b2', 'a3', 'a4' ]
// b is now: [ 'a1', 'a2', 'b3', 'b4' ]

答案 2 :(得分:0)

如果您正在寻找一种洗牌的好方法,或者如果您想了解有关slice的更多信息,我对您的问题并不是100%清楚。对于这个答案,我会假设前者。

实际上很容易得到像wrong这样看似简单的东西。 (错误的是,你的改组方法很容易产生偏差并使某些组合比其他组合更常见)。

更好的洗牌方法是使用像Fisher-Yates Shuffling Algorithm这样的算法。

我为我写的(在Javascript中)的纸牌游戏做了这个,这是我使用的代码:

// this.drawPile is an array of cards
var n = this.drawPile.length;
while (n > 1) {
    n--;
    var k = Math.floor((n + 1) * Math.random());
    var temp = this.drawPile[k];
    this.drawPile[k] = this.drawPile[n];
    this.drawPile[n] = temp;
}

答案 3 :(得分:0)

虽然如果你想在改组甲板的两侧时模拟完全随机性,这并不是完全相关的,试试这个......

const shuffle = (arr1, arr2) => {
  if(!(arr1 instanceof Array) || !(arr2 instanceof Array)) return [];
  var ar1 = arr1.length >= arr2.length ? [...arr1] : [...arr2];
  var ar2 = arr1.length >= arr2.length ? [...arr2] : [...arr1];
  let x = 0;
  for(let i = 0; i < ar1.length; i++) {
    if(x > ar2.length-1) break;
    ar1.splice(Math.floor(Math.random() * (ar1.length+1)), 0, ar2[x]);
    x+=1;
  }
  return ar1;
};