2011-08-13 5 views
0

J'ai deux tableaux avec une série d'entiers. Je veux simuler la coupe d'un jeu de cartes à plusieurs reprises pour «mélanger le jeu». Je définis une position de coupe et j'attribue tout avant la coupure dans le tableau A au début du tableau B. Je me rends compte que je dois utiliser une découpe pour éviter de créer une référence au tableau A, mais je peux utiliser une découpe des deux côtés de l'équation. c'est-à-dire arrayB.slice(0,3) = arrayA.slice(49,52)?Réorganisation des tableaux en Javascript

+0

Je vois la tranche renvoie un nouveau tableau. J'essaye de faire ceci avec seulement deux tableaux, donc je me demande comment je peux copier une tranche d'un tableau dans mon nouveau tableau à une position d'index arbitraire. Cela semble être juste une référence de copie. – Stephen

Répondre

0

Je ne sais pas si des boutures répétées vraiment un remaniement imite, mais peut-être ce n'est pas tout ce que vous faites. Quoi qu'il en soit, après ce que je comprends de votre description, vous voulez:

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

Cela devrait se traduire par une modification arrayB ayant les pièces qui ont été retirés de arrayA en face de ce qu'il avait déjà eu lieu.

Si vous ne pas veulent arrayA modifiées de sorte que ce qui se passe à arrayB n'est plus en arrayA, alors vous utilisez Array.prototype.slice() au lieu de Array.prototype.splice().

En utilisant 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' ] 

Fonctionnant sur les deux tableaux pour que chacune pour recevoir de l'autre:

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' ] 
+0

Dans l'exemple 1 ("Using splice() ..."), comment s'appelle cette syntaxe? J'ai pensé que je devais appeler épissure comme suit: deckA.splice (startIndex, numberToReplace, Element1 ... ElementN); NEVERMIND, je l'ai compris, j'appelle concat sur le tableau retourné par la méthode splice(). Excellent! – Stephen

+0

Merci de m'indiquer dans la bonne direction. J'ai finalement eu recours à ce code: deckB = deckA.splice (0, cutPos); deckB = deckA.concat (deckB); C'est une coupe avec le résultat au deuxième pont. Copiez ensuite B vers A pour la prochaine opération avec: deckA = deckB.slice (0,16); – Stephen

+0

Pas de problème, content que vous ayez quelque chose qui fonctionne comme vous le souhaitez. :) – JAAulde

2

Cela n'a aucun sens d'affecter quoi que ce soit à une valeur de retour d'une fonction comme dans votre exemple. Essayez de regarder dans la méthode splice, il devrait vous donner ce dont vous avez besoin.

Exemple:

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

Splice est exactement ce dont j'avais besoin, beaucoup obligé. – Stephen

+0

Cela fonctionne, à coup sûr, et vous avez exactement raison sur le problème d'attribution.Mais j'avais l'impression que @Stephen voulait ce qui était retiré d'un tableau pour aller au devant de l'autre. 'Array.prototype.push()' les met à la fin. – JAAulde

+0

Attendez, non, cela ne fonctionne pas. 'Array.prototype.push()' définit le tableau résultant de l'épissure comme le dernier élément du tableau sur lequel il a été poussé. Donc, vous vous retrouvez avec quelque chose comme '[1, 2, Array []]' Quand je l'ai vu, je pensais que '.push()' devait faire quelque chose de magique que je ne connaissais pas et était légèrement gêné d'avoir suggéré ' .concat() '. Au test, cependant, je vois que '.concat()' était correct. – JAAulde

0

Je ne suis pas 100% clair de votre question si vous cherchez un bon moyen de mélanger le jeu de cartes, ou si vous voulez plus d'informations sur slice. Pour cette réponse, je vais supposer le premier.

Il est en fait très facile d'obtenir une chose apparemment simple comme le mélange wrong. (Faux dans le sens où votre approche de brassage peut facilement avoir un biais et rendre certaines combinaisons beaucoup plus communes que d'autres).

Une meilleure façon de mélanger est d'utiliser un algorithme comme le Fisher-Yates Shuffling Algorithm.

Je l'ai fait pour un jeu de cartes que j'ai écrit (en Javascript) et voici le code je:

// 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

Mais ne pas couper le pont 100 fois fonctionne encore en théorie puisque, hypothétiquement, un batteur maladroit pourrait faire exactement cela? – Stephen

+0

Excuses, j'ai mal appliqué la définition de «couper le pont». Une coupe maintient la séquence. Je parlais de «shuffle slide» avec des coupes répétées, pas de «riffle» ou de «queue d'aronde». – Stephen

0

Bien que ce n'est pas tout à fait pertinente si vous souhaitez simuler l'aléatoire complet quand traînant deux côtés les platines, essayent ceci ...

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; 
};