2010-10-25 5 views
31

Possible en double:
Javascript swap array elementsPermutation deux éléments dans un tableau javascript

J'ai un tableau comme ceci:

this.myArray = [0,1,2,3,4,5,6,7,8,9]; 

Maintenant ce que je veux faire est, les positions de swap de deux éléments donnent leurs positions. Par exemple, je veux échanger le point 4 (qui est 3) au point 8 (qui est 7) ​​ Ce qui devrait se traduire par:

this.myArray = [0,1,2,7,4,5,6,3,8,9]; 

Comment puis-je y parvenir?

+2

en double (avec des solutions extravagantes pour votre amusement) - http://stackoverflow.com/questions/872310/javascript-swap-array-elements –

Répondre

50

Il suffit de réaffecter les éléments, ce qui crée une variable intermédiaire pour enregistrer le premier vous sur-écriture:

var swapArrayElements = function(arr, indexA, indexB) { 
    var temp = arr[indexA]; 
    arr[indexA] = arr[indexB]; 
    arr[indexB] = temp; 
}; 
// You would use this like: swapArrayElements(myArray, 3, 7); 

Si vous voulez faire cela plus facile à utiliser, vous pouvez même ajouter ceci au prototype Array builtin (comme le suggère Kennebec @) Cependant, il faut savoir que ce qui est généralement un mauvais modèle pour éviter (car cela peut créer des problèmes lorsque plusieurs bibliothèques différentes ont des idées différentes de ce qui appartient aux types builtin):

Array.prototype.swap = function(indexA, indexB) { 
    swapArrayElements(this, indexA, indexB); 
}; 
// You would use this like myArray.swap(3, 7); 

Notez que cette solution est beaucoup plus efficace que l'alternative en utilisant splice(). (O (1) vs O (n)).

+9

O (1) qui ci-dessous n'est pas – Nick

5

Vous pouvez simplement utiliser une variable temporaire pour déplacer les choses, par exemple:

var temp = this.myArray[3]; 
this.myArray[3] = this.myArray[7]; 
this.myArray[7] = temp; 

You can test it out here, ou sous forme de fonction:

Array.prototype.swap = function(a, b) { 
    var temp = this[a]; 
    this[a] = this[b]; 
    this[b] = temp; 
}; 

alors vous suffit d'appeler comme ceci:

this.myArray.swap(3, 7); 

You can test that version here.

75

La valeur de retour d'une épissure est l'élément (s) qui était removed-

pas besoin d'une variable temporaire

Array.prototype.swapItems = function(a, b){ 
    this[a] = this.splice(b, 1, this[a])[0]; 
    return this; 
} 

var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; 

alert(arr.swapItems(3, 7)); 

valeur retournée: (Array)

0,1,2,7,4,5,6,3,8,9 
+1

Nice !! Comment se fait-il que personne d'autre n'a voté cette réponse? – zachzurn

+0

La clé pour comprendre cette solution est que splice() peut avoir des éléments supplémentaires après le démarrage et deleteCount qui seront insérés à la position d'épissage. Un seul défaut: splice() retourne un tableau, donc pour obtenir l'un (et seul) élément de ce tableau, il faudrait dire: 'this [a] = this.splice (b, 1, this [a]) [0]; ' – trembl

+13

Considérez ceci aussi, l'épissure est O (n), http://stackoverflow.com/questions/11514308/big-o-of-javascript-arrays – Nick

Questions connexes