Перестановка массивов в Javascript - PullRequest
0 голосов
/ 13 августа 2011

У меня есть два массива с серией целых чисел.Я хочу смоделировать повторение колоды карт, чтобы «перемешать колоду».Я устанавливаю позицию обрезки и назначаю все до обрезки в массиве A началу массива B. Я понимаю, что мне нужно использовать срез, чтобы не создавать ссылку на массив A, но могу ли я использовать срез по обе стороны уравнениято есть arrayB.slice(0,3) = arrayA.slice(49,52)?

Ответы [ 4 ]

2 голосов
/ 13 августа 2011

Нет особого смысла присваивать что-либо возвращаемому значению функции, как вы делаете в своем примере.

Попробуйте взглянуть на метод сращивания , он должен дать вам то, что вам нужно.

Пример:

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.
0 голосов
/ 22 ноября 2017

Хотя это не совсем актуально, если вы хотите симулировать полную случайность при перетасовке двух сторон колод, попробуйте это ...

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;
};
0 голосов
/ 13 августа 2011

Я не совсем на 100% уверен в вашем вопросе, если вы ищете хороший способ перемешать колоду карт или если вам нужна дополнительная информация о slice. Для этого ответа я приму первое.

На самом деле очень легко получить, казалось бы, такую ​​простую вещь, как тасование неправильно . (Неправильно в том смысле, что ваш подход к тасованию может легко иметь тенденцию и делать некоторые комбинации гораздо более распространенными, чем другие).

Лучший способ перемешать - использовать алгоритм, такой как Алгоритм перетасовки Фишера-Йейтса .

Я сделал это для карточной игры, которую я написал (в 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;
}
0 голосов
/ 13 августа 2011

Я не знаю, действительно ли повторяющиеся рубки имитируют случайное перемешивание, но, возможно, это не все, что вы делаете.В любом случае, исходя из того, что я понимаю из вашего описания, вы хотите:

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

Это должно привести к изменению arrayB, в котором фигуры, которые были удалены из arrayA перед тем, что было ранее.

Если вы не хотите arrayA изменить так, чтобы то, что переходит к arrayB, больше не было в 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' ]
...