Ändert die Funktion .sort das ursprüngliche Array?

Lesezeit: 4 Minuten

Benutzer-Avatar
Prosto-Händler

Ich habe diesen Code:

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

Muss ich arr neu definieren oder ist es möglich, nur die Sortierfunktion aufzurufen? so was:

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

Ändern die Sortier- und Filterfunktionen das ursprüngliche Array?

  • Ich habe es versucht, ich kann nicht verstehen, warum es manchmal nicht funktioniert. Gibt es ein Problem in meinem Code oder missbrauche ich die .sort-Funktion.

    – Prosto-Händler

    6. Juni 2014 um 5:52 Uhr

  • beides wird funktionieren. als die sort ändert das Array. Aber die Komparatorfunktion funktioniert anhand des Rückgabewerts von (+n, 0, -n) nicht boolean. Bitte ändern Sie den Komparator.

    – Kamrül

    6. Juni 2014 um 5:53 Uhr

  • Ich sehe wirklich nicht, was an der Frage falsch ist, aber ja, es ist etwas, das mit dem Operator === vor und nach der Sortierung getestet werden kann.

    – Alexander Mills

    25. September 2017 um 22:08 Uhr

  • Ich fand die Antworten hier sehr unbefriedigend, also habe ich eine Antwort hinzugefügt, die ich für viel besser halte.

    – Alexander Mills

    25. September 2017 um 22:11 Uhr

Benutzer-Avatar
Lex Jacobs

Verwenden slice() sortieren Kopieren des ursprünglichen Arrays.

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

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

mutiert das ursprüngliche Array 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;
});

kehrt zurück

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

wirkt sich aber nicht auf das ursprüngliche Array aus.

console.log(arr) gibt zurück

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

Benutzer-Avatar
Alexander Mills

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. Das === Operator für Objekte vergleicht Speicherorte, also ist es dasselbe Objekt im Speicher.

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

Wenn Sie also möchten, dass es unveränderlich ist, können Sie Folgendes tun:

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

  • Ja! sort() ändert das ursprüngliche Array. Die Funktion filter() erstellt eine gefilterte Kopie, wobei das Original intakt bleibt. sehen developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

    – Bill B

    7. Mai 2019 um 17:28 Uhr

  • Eigentlich finde ich es ganz gut, dass es das Original mutiert. Denn damit können Sie umgehen und umgehen. Sie können “Ich möchte dieses Array so sortieren lassen, dass die vorhandenen Verweise die aktualisierten Daten erhalten” nicht umgehen, aber sie tun es nicht automatisch. Stellen Sie sich vor, wenn arr.push(4,5,6) hat das Original nicht verändert. Das wäre ein Albtraum. Sie müssten sich ausschließlich darauf verlassen arr = arr.concat([4,5,6])und Sie konnten immer noch keine Verweise aktualisieren.

    – Roboter-Renaissance

    30. Dezember 2020 um 18:31 Uhr

Es sortiert das Array an Ort und Stelle (ändert das Array). Aus MDN:

Die Methode sort() sortiert die Elemente eines Arrays an Ort und Stelle und gibt das Array zurück. Die Sorte ist nicht unbedingt stabil. Die Standard-Sortierreihenfolge entspricht Zeichenfolgen-Unicode-Codepunkten.

  • Ein interessantes Feature von Sortieren ist das "undefined property values always sort to the end of the result, followed by non-existent property values"sodass ein Array mit geringer Dichte effektiv in kompakt geändert wird, die ursprüngliche Länge jedoch beibehalten wird.

    – RobG

    6. Juni 2014 um 6:14 Uhr

Ja, es ändert das ursprüngliche Array.

const a = [1, 2, 3];
const b = a.sort();
const c = [...a].sort(); //es6 feauture similar to slice(0)
console.log(a === b); // true
console.log(a === c);//false

Oder von ES6:

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

Benutzer-Avatar
Rohìt Jíndal

Ändern die Sortier- und Filterfunktionen das ursprüngliche Array

Zum Sortieren() Methode, Antwort ist Yes aber für Filter() Methode Antwort ist No.

Lassen Sie es mich an einem Beispiel erklären :

// Original Array
const arr = [5, 4, 3, 2, 1];

// Sorting array values and assigned in a variable.
const sortedArr = arr.sort((a, b) => a-b);

// Original array modified.
console.log(arr); // [1,2,3,4,5]

// New variable with sorted array.
console.log(sortedArr); // [1,2,3,4,5]

Um zu verhindern, dass das ursprüngliche Array geändert wird, können wir verwenden to[Operation] die eine neue Sammlung mit der angewendeten Operation zurückgeben (diese befindet sich derzeit in Phase 3, wird bald verfügbar sein).

const arr = [5, 4, 3, 2, 1];

const sortedArr = arr.toSort((a, b) => a-b);

console.log(arr); // [5, 4, 3, 2, 1]

console.log(sortedArr); // [1, 2, 3, 4, 5]

1016150cookie-checkÄndert die Funktion .sort das ursprüngliche Array?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy