327 votes

Comment trier un tableau sans modifier le tableau d'origine ?

Supposons que je veuille une fonction de tri qui renvoie une copie triée du tableau entré. J'ai naïvement essayé ceci

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

et je l'ai testé avec ceci, qui montre que mon sort est en train de muter le tableau.

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"

J'ai également essayé cette approche

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

mais ça ne fonctionne pas du tout.

Existe-t-il un moyen simple de contourner ce problème, de préférence un moyen qui ne nécessite pas de faire tourner à la main mon propre algorithme de tri ou de copier chaque élément du tableau dans un nouveau tableau ?

296voto

Putzi San Points 1232

Vous devez copier le tableau avant de le trier. Un seul moyen avec es6 :

const sorted = [...arr].sort();

la syntaxe de l'étalement en tant que littéral de tableau (copié de mdn) :

var arr = [1, 2, 3];
var arr2 = [...arr]; // like arr.slice()

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator

244voto

Rob W Points 125904

Il suffit de copier le tableau. Il existe de nombreuses façons de le faire :

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

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

75voto

JaredPar Points 333733

Essayez ce qui suit

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

Le site slice(0) crée une copie du tableau à partir de l'élément 0.

43voto

zzzzBov Points 62084

Vous pouvez utiliser slice sans argument pour copier un tableau :

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

17voto

Aditya Agarwal Points 147

Vous pouvez également le faire

d = [20, 30, 10]
e = Array.from(d)
e.sort()

De cette façon, il n'y aura pas de mutation.

function sorted(arr) {
  temp = Array.from(arr)
  return temp.sort()
}

//Use it like this
x = [20, 10, 100]
console.log(sorted(x))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X