56 Stimmen

Ändert die .sort Funktion das originale Array?

Ich habe diesen Code:

arr = arr.sort(function (a, b) {
    return a.time>b.time
})

Muss ich arr neu definieren oder kann ich einfach die sort-Funktion aufrufen? Wie hier:

arr.sort(function (a, b) {
    return a.time>b.time
})

Werden die sort- und filter-Funktionen das Original-Array ändern?

76voto

LexJacobs Punkte 2513

Verwenden Sie slice(), um eine Kopie des Originalarrays zu sortieren.

var arr =[{time:4},{time:3},{time:6}];

arr.sort(function (a, b) {
  return a.time-b.time;
});

verändert das Originalarray und gibt zurück:

[ { time: 3 }, { time: 4 }, { time: 6 } ]

und console.log(arr) gibt zurück

[ { time: 3 }, { time: 4 }, { time: 6 } ]

aber

var arr =[{time:4},{time:3},{time:6}];
arr.slice().sort(function (a, b) {
  return a.time-b.time;
});

gibt zurück

[ { time: 3 }, { time: 4 }, { time: 6 } ]

aber beeinflusst das Originalarray nicht.

console.log(arr) gibt zurück

[ { time: 4 }, { time: 3 }, { time: 6 } ]

23voto

Alexander Mills Punkte 76733

Es ist eine anständige Frage, und lassen Sie uns sie richtig beantworten:

const a = [1, 2, 3];
const b = a.sort();
console.log(a === b); // true

da ist deine Antwort. Der === Operator für Objekte vergleicht Speicherorte, also ist es das gleiche Objekt im Speicher.

Was schade ist, weil es besser wäre, wenn sort ein neues Array erstellen würde (Unveränderlichkeit usw.), aber in vielen Sprachen gibt es kein neues Array zurück, sondern dasselbe Array (neu geordnet).

Also, wenn du möchtest, dass es unveränderlich ist, könntest du folgendes tun:

const a = [1, 2, 3];
const b = a.slice(0).sort();

10voto

jfriend00 Punkte 632952

Es sortiert das Array vor Ort (indem es das Array ändert). Von MDN:

Die sort() Methode sortiert die Elemente eines Arrays vor Ort und gibt das Array zurück. Die Sortierung ist nicht unbedingt stabil. Die Standard-Sortierreihenfolge erfolgt gemäß der Unicode-Zeichenpunkte von Strings.

5voto

SUSEENDHAR LAL Punkte 141

Ja, es ändert das Original-Array.

const a = [1, 2, 3];
const b = a.sort();
const c = [...a].sort(); //es6 Funktion ähnlich zu slice(0)
console.log(a === b); // true
console.log(a === c);//false

2voto

Adrian Bartholomew Punkte 2143

Oder von ES6:

const a = [1, 2, 3];
const b = [...a].sort();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X