javascript serve Como você pode classificar uma matriz sem alterar o array original?




javascript pdf (5)

Vamos supor que eu quisesse uma função de classificação que retornasse uma cópia ordenada da matriz inserida. Eu ingenuamente tentei isso

function sort(arr) {
  return arr.sort();
}

e eu testei com isso, o que mostra que o meu método de sort está mudando o array.

var a = [2,3,7,5,3,7,1,3,4];
sort(a);
alert(a);  //alerts "1,2,3,3,3,4,5,7,7"

Eu também tentei essa abordagem

function sort(arr) {
  return Array.prototype.sort(arr);
}

mas não funciona de todo.

Existe uma maneira direta de contornar isso, de preferência de uma forma que não exija a rolagem manual de meu próprio algoritmo de classificação ou a cópia de todos os elementos da matriz em um novo?


Eu uso Object.assign() para a maioria das minhas cópias:

var copyArray = Object.assign([], originalArray).sort();

No entanto, depois de examinar os comentários do OP, pesquisei um pouco de cópia profunda e, além disso, o Object.assign não apenas executa uma cópia superficial, como também seleciona apenas as propriedades enumeráveis ​​e próprias (conforme respondidas neste post ).


Tente o seguinte

function sortCopy(arr) { 
  return arr.slice(0).sort();
}

A expressão slice(0) cria uma cópia da matriz começando no elemento 0.



Você pode usar uma fatia sem argumentos para copiar uma matriz:

var foo,
    bar;
foo = [3,1,2];
bar = foo.slice().sort();

Apenas copie o array. Há muitas maneiras de fazer isso:

function sort(arr) {
  return arr.concat().sort();
}

// Or:
return Array.prototype.slice.call(arr).sort(); // For array-like objects




javascript