Existe-t-il un moyen plus simple d'échanger deux éléments dans un tableau?
var a = list[x], b = list[y];
list[y] = a;
list[x] = b;
Existe-t-il un moyen plus simple d'échanger deux éléments dans un tableau?
var a = list[x], b = list[y];
list[y] = a;
list[x] = b;
Vous n'avez besoin que d'une variable temporaire.
var b = list[y];
list[y] = list[x];
list[x] = b;
Modifier la meilleure réponse de détournement 10 ans plus tard avec beaucoup d'adoption ES6 sous nos ceintures:
Étant donné le tableau arr = [1,2,3,4]
, vous pouvez maintenant échanger des valeurs sur une seule ligne comme suit:
[arr[0], arr[1]] = [arr[1], arr[0]];
Cela produirait le tableau [2,1,3,4]
. C'est une mission destructurante .
a = [b, b = a][0];
comme souligné par @Jan Bien que je continue à utiliser l'approche de variable temporaire car elle est cross-language (par exemple C / C ++ ) et la première approche qui me vient habituellement à l'esprit.[ list[y], list[x] ] = [ list[x], list[y] ];
[arr[0], arr[1]] = [arr[1], arr[0]]
produire uniquement[2, 1]
sans le reste de la gammeSi vous voulez une seule expression, en utilisant du javascript natif, n'oubliez pas que la valeur de retour d'une opération d'épissage contient le ou les éléments qui ont été supprimés.
Éditer:
Le
[0]
est nécessaire à la fin de l'expression asArray.splice()
renvoie un tableau, et dans cette situation, nous avons besoin de l'élément unique dans le tableau renvoyé.la source
Cela semble ok ....
Howerver utilisant
signifie un b variable va être présente pour le reste de la portée. Cela peut potentiellement entraîner une fuite de mémoire. Peu probable, mais encore mieux à éviter.
Peut-être une bonne idée de mettre cela dans Array.prototype.swap
qui peut être appelé comme:
Il s'agit d'une approche propre à la fois pour éviter les fuites de mémoire et DRY .
la source
Array.prototype.swap = function (x,y) { if (x >= 0 && x < this.length && y >= 0 && y < this.length) { var b = this[x]; this[x] = this[y]; this[y] = b; } return this; };
Selon une personne aléatoire sur Metafilter , "Les versions récentes de Javascript vous permettent de faire des échanges (entre autres) beaucoup plus proprement:"
Mes tests rapides ont montré que ce code Pythonic fonctionne très bien dans la version de JavaScript actuellement utilisée dans "Google Apps Script" (".gs"). Hélas, d'autres tests montrent que ce code donne un "Uncaught ReferenceError: côté gauche non valide dans l'affectation". quelle que soit la version de JavaScript (".js") est utilisée par Google Chrome version 24.0.1312.57 m.
la source
Eh bien, vous n'avez pas besoin de mettre en mémoire tampon les deux valeurs - une seule:
la source
Vous pouvez échanger des éléments dans un tableau de la manière suivante:
Voir l'exemple suivant:
Remarque: cela fonctionne de la même manière pour les variables régulières
la source
[list[x], list[y]] = [list[y], list[x]];
.this[0] > this[1] && (this[0] = [this[1],this[1]=this[0]][0]);
Avec les valeurs numériques, vous pouvez éviter une variable temporaire en utilisant xor au niveau du bit
ou une somme arithmétique (en notant que cela ne fonctionne que si x + y est inférieur à la valeur maximale pour le type de données)
la source
list[y] = list[x] - list[x];
seulement àlist[y] = 0;
?Cela n'existait pas lorsque la question a été posée, mais ES2015 a introduit la déstructuration des baies, vous permettant de l'écrire comme suit:
la source
[list[x], list[y]] = [list[y], list[x]];
Pour échanger deux éléments consécutifs d'un tableau
la source
Résumé de http://www.greywyvern.com/?post=265
la source
swap(a, b)
fonction, vous n'avez pas à vous soucier de la lisibilité.Qu'en est-il de la destruction_assignation
qui peut également être étendu à
la source
Considérez une telle solution sans avoir besoin de définir la troisième variable:
Remarque: vous souhaiterez peut-être ajouter des vérifications supplémentaires, par exemple pour la longueur du tableau. Cette solution est modifiable , la
swap
fonction n'a donc pas besoin de renvoyer un nouveau tableau, elle effectue simplement une mutation sur le tableau passé.la source
arr.splice(from, 1, arr.splice(to, 1, ...arr[from]))
Vous pouvez échanger n'importe quel nombre d'objets ou de littéraux, même de différents types, à l'aide d'une simple fonction d'identité comme celle-ci:
Pour votre problème:
Cela fonctionne en JavaScript car il accepte des arguments supplémentaires même s'ils ne sont pas déclarés ou utilisés. Les affectations,
a=b
etc., se produisent après leura
passage dans la fonction.la source
list[y] = (function(x){return x})(list[x],list[x]=list[y]);
. Ou, si vous êtes intéressé à ES6 (prochaine version de JS), il est incroyablement facile:[list[x], list[y]] = [list[y], list[x]
. Je suis tellement content qu'ils ajoutent des aspects plus fonctionnels et basés sur les classes dans la prochaine version de JavaScript.Pour deux éléments ou plus (nombre fixe)
Aucune variable temporaire requise!
Je pensais simplement appeler
list.reverse()
.Mais j'ai réalisé que cela ne fonctionnerait comme échange que lorsque
list.length = x + y + 1
.Pour un nombre variable d'éléments
J'ai examiné différentes constructions Javascript modernes à cet effet, y compris Map et map , mais malheureusement, aucune n'a abouti à un code plus compact ou plus rapide que cette construction à l'ancienne en boucle:
la source
Il existe une façon intéressante de permuter:
(Manière ES6)
la source
var a= [7,8,9,10], i=2, j=3;[a[i],a[j]] = [a[j],a[i]];
la source
Voici une doublure qui ne mute pas
list
:let newList = Object.assign([], list, {[x]: list[y], [y]: list[x]})
(Utilise les fonctionnalités linguistiques non disponibles en 2009 lorsque la question a été publiée!)
la source
Voici une version compacte échange la valeur à i1 avec i2 en arr
la source
Voici une variante qui vérifie d'abord si l'index existe dans le tableau:
Actuellement, il reviendra simplement
this
si l'index n'existe pas, mais vous pouvez facilement modifier le comportement en cas d'échecla source
Échangez le premier et le dernier élément d'un tableau sans variable temporaire ou méthode d'échange ES6 [a, b] = [b, a]
[a.pop(), ...a.slice(1), a.shift()]
la source
Solution dactylographiée qui clone le tableau au lieu de muter celui existant
la source
Juste pour le plaisir, une autre façon sans utiliser de variable supplémentaire serait:
la source
Par souci de concision, voici la version laide à une ligne qui n'est que légèrement moins laide que tout ce qui est concaténé et tranché ci-dessus. La réponse acceptée est vraiment la voie à suivre et bien plus lisible.
Donné:
si vous souhaitez échanger les valeurs de deux indices (a et b); alors cela le ferait:
Par exemple, si vous souhaitez échanger les 3 et 5, vous pouvez le faire de cette façon:
ou
Les deux donnent le même résultat:
#splicehatersarepunks :)
la source
Si vous ne souhaitez pas utiliser la variable temp dans ES5, c'est une façon d'échanger les éléments du tableau.
la source
a.splice
renvoie un tableau avec les éléments supprimés. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…essayez cette fonction ...
la source
la source
Utilisation d' ES6 il est possible de le faire comme ceci ...
Imaginez que vous ayez ces 2 tableaux ...
et vous voulez échanger les premières valeurs:
et valeur:
la source
Usage:
la source
Array
prototype ne faisait pas partie de ce qui était demandé - cela peut confondre plus que bon.Si vous souhaitez permuter uniquement les premiers et derniers éléments:
la source
[1, 2, 3] => [3, 1, 2]
au lieu de[1, 2, 3] => [3, 2, 1]
.