¿Hay alguna forma más simple de intercambiar dos elementos en una matriz?
var a = list[x], b = list[y];
list[y] = a;
list[x] = b;
javascript
arrays
conocido
fuente
fuente
a = [b, b = a][0];
como lo señaló @Jan, aunque todavía me encuentro utilizando el enfoque de variable temporal como lenguaje cruzado (por ejemplo, C / C ++ ) y el primer enfoque que suele aparecer en mi mente.[ list[y], list[x] ] = [ list[x], list[y] ];
[arr[0], arr[1]] = [arr[1], arr[0]]
producir solo[2, 1]
sin el resto de la matrizSi desea una sola expresión, utilizando JavaScript nativo, recuerde que el valor de retorno de una operación de empalme contiene los elementos que se eliminaron.
Editar:
El
[0]
es necesario al final de la expresión, ya queArray.splice()
devuelve una matriz, y en esta situación requerimos el único elemento en la matriz devuelta.fuente
Esto parece estar bien ...
Howerver usando
significa que una variable b va a estar presente para el resto del alcance. Esto puede conducir a una pérdida de memoria. Improbable, pero aún mejor evitarlo.
Quizás sea una buena idea poner esto en Array.prototype.swap
que se puede llamar como:
Este es un enfoque limpio para evitar pérdidas de memoria y SECO .
fuente
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; };
Según una persona aleatoria en Metafilter , "las versiones recientes de Javascript le permiten hacer intercambios (entre otras cosas) mucho más claramente:"
Mis pruebas rápidas mostraron que este código Pythonic funciona muy bien en la versión de JavaScript utilizada actualmente en "Google Apps Script" (".gs"). Por desgracia, otras pruebas muestran que este código proporciona un "Error de referencia no capturado: lado izquierdo no válido en la asignación". en cualquier versión de JavaScript (".js") utilizada por Google Chrome Versión 24.0.1312.57 m.
fuente
Bueno, no necesita almacenar ambos valores, solo uno:
fuente
Puede intercambiar elementos en una matriz de la siguiente manera:
Vea el siguiente ejemplo:
Nota: funciona de la misma manera para variables regulares
fuente
[list[x], list[y]] = [list[y], list[x]];
.this[0] > this[1] && (this[0] = [this[1],this[1]=this[0]][0]);
Con valores numéricos puede evitar una variable temporal utilizando bitor xor
o una suma aritmética (teniendo en cuenta que esto solo funciona si x + y es menor que el valor máximo para el tipo de datos)
fuente
list[y] = list[x] - list[x];
solo equivale alist[y] = 0;
?Esto no existía cuando se hizo la pregunta, pero ES2015 introdujo la desestructuración de la matriz, lo que le permite escribirla de la siguiente manera:
fuente
[list[x], list[y]] = [list[y], list[x]];
Para intercambiar dos elementos consecutivos de la matriz
fuente
Recopilación de http://www.greywyvern.com/?post=265
fuente
swap(a, b)
función, no necesita preocuparse por la legibilidad.¿Qué pasa con Destructuring_assignment
que también se puede extender a
fuente
Considere tal solución sin necesidad de definir la tercera variable:
Nota: es posible que desee agregar comprobaciones adicionales, por ejemplo, para la longitud de la matriz. Esta solución es mutable, por lo que la
swap
función no necesita devolver una nueva matriz, solo hace la mutación sobre la matriz pasada.fuente
arr.splice(from, 1, arr.splice(to, 1, ...arr[from]))
Puede intercambiar cualquier cantidad de objetos o literales, incluso de diferentes tipos, utilizando una función de identidad simple como esta:
Para su problema:
Esto funciona en JavaScript porque acepta argumentos adicionales incluso si no se declaran ni se utilizan. Las asignaciones
a=b
, etc., suceden después dea
pasar a la función.fuente
list[y] = (function(x){return x})(list[x],list[x]=list[y]);
. O, si usted está interesado en la ES6 (próxima versión de JS), que es increíblemente fácil:[list[x], list[y]] = [list[y], list[x]
. Estoy muy contento de que estén agregando algunos aspectos más funcionales y basados en clases en la próxima versión de JavaScript.Para dos o más elementos (número fijo)
¡No se requiere una variable temporal!
Estaba pensando en simplemente llamar
list.reverse()
.Pero luego me di cuenta de que funcionaría como intercambio solo cuando
list.length = x + y + 1
.Para un número variable de elementos
He examinado varias construcciones Javascript modernas para este efecto, incluyendo Map y map , pero lamentablemente ninguna ha resultado en un código que sea más compacto o más rápido que esta construcción antigua basada en bucles:
fuente
Hay una forma interesante de intercambio:
(Forma ES6)
fuente
var a= [7,8,9,10], i=2, j=3;[a[i],a[j]] = [a[j],a[i]];
fuente
Aquí hay una frase que no muta
list
:let newList = Object.assign([], list, {[x]: list[y], [y]: list[x]})
(Utiliza funciones de idioma que no estaban disponibles en 2009 cuando se publicó la pregunta)
fuente
Aquí hay un valor de intercambio de versión compacta en i1 con i2 en arr
fuente
Aquí hay una variación que primero verifica si el índice existe en la matriz:
Actualmente solo regresará
this
si el índice no existe, pero podría modificar fácilmente el comportamiento en caso de fallafuente
Intercambie el primer y el último elemento en una matriz sin variable temporal o método de intercambio ES6 [a, b] = [b, a]
[a.pop(), ...a.slice(1), a.shift()]
fuente
Solución mecanografiada que clona la matriz en lugar de mutar la existente
fuente
Solo por el gusto de hacerlo, otra forma sin usar ninguna variable adicional sería:
fuente
En aras de la brevedad, aquí está la versión fea de una sola línea que es solo un poco menos fea que toda esa concat y rebanadas anteriores. La respuesta aceptada es realmente el camino a seguir y mucho más legible.
Dado:
si desea intercambiar los valores de dos índices (a y b); entonces esto lo haría:
Por ejemplo, si desea intercambiar el 3 y el 5, puede hacerlo de esta manera:
o
Ambos producen el mismo resultado:
#splicehatersarepunks :)
fuente
Si no desea utilizar la variable temporal en ES5, esta es una forma de intercambiar elementos de la matriz.
fuente
a.splice
devuelve una matriz con los elementos eliminados. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…prueba esta función ...
fuente
fuente
Usando ES6 es posible hacerlo así ...
Imagina que tienes estas 2 matrices ...
y quieres intercambiar los primeros valores:
y valor:
fuente
Uso:
fuente
Array
prototipo no era parte de lo que se solicitó, puede confundir más de lo que hace bien.Si es necesario, intercambie solo el primer y el último elemento:
fuente
[1, 2, 3] => [3, 1, 2]
lugar de[1, 2, 3] => [3, 2, 1]
.