Existe alguma maneira mais simples de trocar dois elementos em uma matriz?
var a = list[x], b = list[y];
list[y] = a;
list[x] = b;
javascript
arrays
ken
fonte
fonte
a = [b, b = a][0];
como apontado por @Jan Embora eu ainda me encontre utilizando a abordagem de variável temporária como é uma linguagem cruzada (por exemplo, C / C ++ ) e a primeira abordagem que geralmente vem à minha mente.[ list[y], list[x] ] = [ list[x], list[y] ];
[arr[0], arr[1]] = [arr[1], arr[0]]
produzir apenas[2, 1]
, sem o resto da matrizSe você deseja uma única expressão, usando javascript nativo, lembre-se de que o valor de retorno de uma operação de emenda contém os elementos que foram removidos.
Editar:
O
[0]
é necessário no final da expressão, poisArray.splice()
retorna uma matriz e, nessa situação, exigimos o elemento único na matriz retornada.fonte
Isso parece ok ....
Howerver usando
significa a b variável estará presente no restante do escopo. Isso pode levar a um vazamento de memória. Improvável, mas ainda melhor evitar.
Talvez seja uma boa ideia colocar isso em Array.prototype.swap
que pode ser chamado como:
Essa é uma abordagem limpa para evitar vazamentos de memória e DRY .
fonte
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; };
De acordo com uma pessoa aleatória no Metafilter , "As versões recentes do Javascript permitem fazer trocas (entre outras coisas) de maneira muito mais clara:"
Meus testes rápidos mostraram que esse código Pythonic funciona muito bem na versão do JavaScript atualmente usada no "Script do Google Apps" (".gs"). Infelizmente, testes adicionais mostram que esse código fornece um "Erro de referência não detectado: lado esquerdo inválido na atribuição". em qualquer versão do JavaScript (".js") usada pelo Google Chrome versão 24.0.1312.57 m.
fonte
Bem, você não precisa armazenar os dois valores em buffer - apenas um:
fonte
Você pode trocar elementos em uma matriz da seguinte maneira:
Veja o seguinte exemplo:
Nota: funciona da mesma maneira para variáveis regulares
fonte
[list[x], list[y]] = [list[y], list[x]];
.this[0] > this[1] && (this[0] = [this[1],this[1]=this[0]][0]);
Com valores numéricos, você pode evitar uma variável temporária usando xor bit a bit
ou uma soma aritmética (observando que isso só funciona se x + y for menor que o valor máximo para o tipo de dados)
fonte
list[y] = list[x] - list[x];
equivale apenas alist[y] = 0;
?Isso não existia quando a pergunta foi feita, mas o ES2015 introduziu a desestruturação da matriz, permitindo que você a escreva da seguinte maneira:
fonte
[list[x], list[y]] = [list[y], list[x]];
Para trocar dois elementos consecutivos da matriz
fonte
Resumo de http://www.greywyvern.com/?post=265
fonte
swap(a, b)
função, não precisará se preocupar com a legibilidade.o que dizer de Destructuring_assignment
que também pode ser estendido para
fonte
Considere essa solução sem a necessidade de definir a terceira variável:
Nota: convém adicionar verificações adicionais, por exemplo, para o comprimento da matriz. Esta solução é mutável, portanto, a
swap
função não precisa retornar uma nova matriz, apenas faz a mutação na matriz passada.fonte
arr.splice(from, 1, arr.splice(to, 1, ...arr[from]))
Você pode trocar qualquer número de objetos ou literais, mesmo de tipos diferentes, usando uma função de identidade simples como esta:
Para o seu problema:
Isso funciona no JavaScript porque aceita argumentos adicionais, mesmo que não sejam declarados ou usados. As atribuições
a=b
etc acontecem depois quea
são passadas para a função.fonte
list[y] = (function(x){return x})(list[x],list[x]=list[y]);
. Ou, se você estiver interessado em ES6 (próxima versão do JS), é insanamente fácil:[list[x], list[y]] = [list[y], list[x]
. Estou tão feliz que eles estão adicionando alguns aspectos mais funcionais e baseados em classe na próxima versão do JavaScript.Para dois ou mais elementos (número fixo)
Nenhuma variável temporária é necessária!
Eu estava pensando em simplesmente ligar
list.reverse()
.Mas então percebi que só funcionaria como swap quando
list.length = x + y + 1
.Para número variável de elementos
Analisei várias construções Javascript modernas para esse efeito, incluindo Mapa e mapa , mas infelizmente nenhuma resultou em um código mais compacto ou mais rápido do que essa construção antiquada e baseada em loop:
fonte
Há uma maneira interessante de trocar:
(Caminho ES6)
fonte
var a= [7,8,9,10], i=2, j=3;[a[i],a[j]] = [a[j],a[i]];
fonte
Aqui está uma frase que não muda
list
:let newList = Object.assign([], list, {[x]: list[y], [y]: list[x]})
(Usa recursos de idioma não disponíveis em 2009 quando a pergunta foi publicada!)
fonte
Aqui está uma versão compacta que troca o valor em i1 com i2 em arr
fonte
Aqui está uma variação que primeiro verifica se o índice existe na matriz:
Atualmente, ele retornará apenas
this
se o índice não existir, mas você poderá modificar facilmente o comportamento em caso de falhafonte
Troque o primeiro e o último elemento em uma matriz sem variável temporária ou método de troca ES6 [a, b] = [b, a]
[a.pop(), ...a.slice(1), a.shift()]
fonte
Solução datilografada que clona a matriz em vez de alterar uma existente
fonte
Apenas por diversão, outra maneira sem usar nenhuma variável extra seria:
fonte
Por uma questão de brevidade, aqui está a versão feia de uma linha que é apenas um pouco menos feia do que todas as concat e fatias acima. A resposta aceita é realmente o caminho a percorrer e muito mais legível.
Dado:
se você deseja trocar os valores de dois índices (a e b); então isso faria isso:
Por exemplo, se você deseja trocar os 3 e 5, pode fazê-lo desta maneira:
ou
Ambos produzem o mesmo resultado:
#splicehatersarepunks :)
fonte
Se você não deseja usar a variável temp no ES5, essa é uma maneira de trocar elementos da matriz.
fonte
a.splice
retorna uma matriz com os elementos removidos. developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/…tente esta função ...
fonte
fonte
Usando o ES6 , é possível fazer assim ...
Imagine que você tem essas duas matrizes ...
e você deseja trocar os primeiros valores:
e valor:
fonte
Uso:
fonte
Array
protótipo não fazia parte do que foi solicitado - ele pode confundir mais do que serve.Se for necessário trocar apenas o primeiro e o último elementos:
fonte
[1, 2, 3] => [3, 1, 2]
vez de[1, 2, 3] => [3, 2, 1]
.