Javascript – Array basierend auf einem anderen Array sortieren

Lesezeit: 6 Minuten

Javascript Array basierend auf einem anderen Array sortieren
Benutzer1448892

Ist es möglich, ein Array zu sortieren und neu anzuordnen, das so aussieht:

itemsArray = [ 
    ['Anne', 'a'],
    ['Bob', 'b'],
    ['Henry', 'b'],
    ['Andrew', 'd'],
    ['Jason', 'c'],
    ['Thomas', 'b']
]

um die Anordnung dieses Arrays anzupassen:

sortingArr = [ 'b', 'c', 'b', 'b', 'a', 'd' ]

Leider habe ich keine Ausweise, um den Überblick zu behalten. Ich müsste das Items-Array so priorisieren, dass es dem sortingArr so gut wie möglich entspricht.

Aktualisieren:

Hier ist die Ausgabe, die ich suche:

itemsArray = [    
    ['Bob', 'b'],
    ['Jason', 'c'],
    ['Henry', 'b'],
    ['Thomas', 'b']
    ['Anne', 'a'],
    ['Andrew', 'd'],
]

Irgendeine Idee, wie das gemacht werden kann?

  • Wenn Sie nicht alles manuell machen wollen, werfen Sie einen Blick auf die Array-Funktion sin PHP.js.

    – Adi

    9. November 2012 um 8:36 Uhr

  • Wo mehrere Arrays den gleichen Sortierwert haben (dh ‘b’), wie entscheiden Sie, welches Element wohin im sortierten Array gehört? Bei ‘Bob’, ‘Henry’ und ‘Thomas’, die alle den Wert ‘b’ haben – wie entscheiden Sie, wer an erster, dritter und vierter Stelle steht?

    – Mitch Satchwell

    9. November 2012 um 8:52 Uhr


Javascript Array basierend auf einem anderen Array sortieren
Durgpal Singh

One-Line-Antwort.

itemsArray.sort(function(a, b){  
  return sortingArr.indexOf(a) - sortingArr.indexOf(b);
});

Oder noch kürzer:

itemsArray.sort((a, b) => sortingArr.indexOf(a) - sortingArr.indexOf(b));

  • Das wird mutieren itemsArray. Je nach Leistungsanforderung wäre es viel sicherer zu tun itemsArray.slice().sort(...).

    – Kevin Ghadyani

    6. März 2018 um 19:09 Uhr

  • sort-Methode gibt ein Array zurück. sehen developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

    – Durgpal Singh

    12. Oktober 2018 um 6:26 Uhr

  • Es gibt das Array zurück, aber es führt auch die Sortierung an Ort und Stelle durch und mutiert das Original.

    – mynameistechno

    13. November 2018 um 0:22 Uhr

  • Dies sollte eine echte Antwort sein

    – Murmeln

    17. Juli 2019 um 15:56 Uhr

  • @Morvael, dies liegt an dieser erforderlichen Antwort sortingArr alle Werte enthalten itemsArray. Die Lösung besteht darin, Elemente an die Rückseite des Arrays zu verschieben, wenn sie darin nicht vorhanden sind sortingArr : allProducts.sort((product1, product2) => { const index1 = manualSort.indexOf(product1.id); const index2 = manualSort.indexOf(product2.id); return ( (index1 > -1 ? index1 : Infinity) - (index2 > -1 ? index2 : Infinity) ); });

    – Freshollie

    9. Oktober 2019 um 9:20 Uhr


1646639118 397 Javascript Array basierend auf einem anderen Array sortieren
georg

Etwas wie:

items = [ 
    ['Anne', 'a'],
    ['Bob', 'b'],
    ['Henry', 'b'],
    ['Andrew', 'd'],
    ['Jason', 'c'],
    ['Thomas', 'b']
]

sorting = [ 'b', 'c', 'b', 'b', 'c', 'd' ];
result = []

sorting.forEach(function(key) {
    var found = false;
    items = items.filter(function(item) {
        if(!found && item[1] == key) {
            result.push(item);
            found = true;
            return false;
        } else 
            return true;
    })
})

result.forEach(function(item) {
    document.writeln(item[0]) /// Bob Jason Henry Thomas Andrew
})

Hier ist ein kürzerer Code, aber er zerstört die sorting Array:

result = items.map(function(item) {
    var n = sorting.indexOf(item[1]);
    sorting[n] = '';
    return [n, item]
}).sort().map(function(j) { return j[1] })

  • Quadratische Komplexität! Versuchen Sie es mit einer großen Datenmenge…

    – Julien Royer

    9. November 2012 um 9:27 Uhr

  • @thg435: Komplexität hat wenig mit “Optimierung” zu tun, es sei denn, das Datenvolumen ist garantiert klein (was hier der Fall sein kann).

    – Julien Royer

    9. November 2012 um 9:36 Uhr

  • @georg Wenn es um die Komplexität von Algorithmen geht, die auf Datenstrukturen einwirken, ist die Optimierung von Algorithmen mit quadratischer (oder schlechterer) Komplexität niemals verfrüht und immer notwendig (es sei denn, Sie können garantieren, dass die Größe des Datensatzes klein sein wird). . Der Leistungsunterschied wird (buchstäblich) in Größenordnungen ausgedrückt.

    – Abion47

    4. Februar 2019 um 20:26 Uhr

Wenn Sie die native Array-Sortierfunktion verwenden, können Sie einen benutzerdefinierten Komparator übergeben, der beim Sortieren des Arrays verwendet wird. Der Komparator sollte eine negative Zahl zurückgeben, wenn der erste Wert kleiner als der zweite ist, Null, wenn sie gleich sind, und eine positive Zahl, wenn der erste Wert größer ist.

Also, wenn ich das Beispiel, das Sie geben, richtig verstehe, könnten Sie so etwas tun:

function sortFunc(a, b) {
  var sortingArr = [ 'b', 'c', 'b', 'b', 'c', 'd' ];
  return sortingArr.indexOf(a[1]) - sortingArr.indexOf(b[1]);
}

itemsArray.sort(sortFunc);

  • Das wird nicht funktionieren, die resultierende Reihenfolge wäre b,b,b,c,c,d as indexOf gibt den ersten Index zurück.

    – Mitch Satchwell

    9. November 2012 um 8:50 Uhr

  • Vielen Dank, aber ich möchte, dass die Ausgabe von itemsArray mit sortingArray übereinstimmt.

    – Benutzer1448892

    9. November 2012 um 8:51 Uhr

  • Ich bevorzuge diese Antwort, wenn die “IDs” in der sortingArr sind einzigartig – was sie zum Glück in meinem Fall sind 🙂

    – dillondrenzek

    12. Mai 2017 um 16:57 Uhr

  • Sie sollten die deklarieren sortingArray außerhalb der Funktion, um eine erneute Deklaration bei jeder Sortieriteration zu vermeiden

    – Aurumtestest

    6. September 2018 um 8:33 Uhr

Javascript Array basierend auf einem anderen Array sortieren
Don McCurdy

Fall 1: Ursprüngliche Frage (keine Bibliotheken)

Viele andere Antworten, die funktionieren. 🙂

Fall 2: Ursprüngliche Frage (Lodash.js oder Underscore.js)

var groups = _.groupBy(itemArray, 1);
var result = _.map(sortArray, function (i) { return groups[i].shift(); });

Fall 3: Sortieren Sie Array1, als ob es Array2 wäre

Ich vermute, dass die meisten Leute hierher gekommen sind, um nach einem Äquivalent zu PHPs array_multisort zu suchen (ich habe es getan), also dachte ich, ich würde diese Antwort auch posten. Es gibt ein paar Optionen:

1. Es gibt eine bestehende JS-Implementierung von array_multisort(). Danke an @Adnan für den Hinweis in den Kommentaren. Es ist allerdings ziemlich groß.

2. Schreiben Sie Ihre eigenen. (JSFiddle-Demo)

function refSort (targetData, refData) {
  // Create an array of indices [0, 1, 2, ...N].
  var indices = Object.keys(refData);

  // Sort array of indices according to the reference data.
  indices.sort(function(indexA, indexB) {
    if (refData[indexA] < refData[indexB]) {
      return -1;
    } else if (refData[indexA] > refData[indexB]) {
      return 1;
    }
    return 0;
  });

  // Map array of indices to corresponding values of the target array.
  return indices.map(function(index) {
    return targetData[index];
  });
}

3. Lodash.js oder Unterstrich.js (beides beliebte, kleinere Bibliotheken, die sich auf die Leistung konzentrieren) bieten Hilfsfunktionen, mit denen Sie dies tun können:

    var result = _.chain(sortArray)
      .pairs()
      .sortBy(1)
      .map(function (i) { return itemArray[i[0]]; })
      .value();

… in die (1) das sortArray gruppiert wird [index, value] Paare, (2) sortieren Sie sie nach dem Wert (Sie können hier auch einen Rückruf angeben), (3) ersetzen Sie jedes der Paare durch das Element aus dem itemArray an dem Index, aus dem das Paar stammt.

1646639120 178 Javascript Array basierend auf einem anderen Array sortieren
Susrut

Dies ist wahrscheinlich zu spät, aber Sie könnten auch eine modifizierte Version des folgenden Codes im ES6-Stil verwenden. Dieser Code ist für Arrays wie:

var arrayToBeSorted = [1,2,3,4,5];
var arrayWithReferenceOrder = [3,5,8,9];

Der eigentliche Betrieb:

arrayToBeSorted = arrayWithReferenceOrder.filter(v => arrayToBeSorted.includes(v));

Die eigentliche Operation in ES5:

arrayToBeSorted = arrayWithReferenceOrder.filter(function(v) {
    return arrayToBeSorted.includes(v);
});

Sollte dazu führen arrayToBeSorted = [3,5]

Zerstört das Referenz-Array nicht.

  • Was ist, wenn ich das arrayToBeSorted ein Array von Objekten ist, dh: {1: {…}, 2: {…}, 3: {…}, 4: {…}, 5: {…}}? aber das arrayWithReferenceOrder ist nur ein normales Array?

    – Kristall

    28. November 2017 um 0:16 Uhr

  • @sushruth wie sortiert das das Array?

    – hitautodestruct

    19. Mai 2019 um 11:39 Uhr

  • @Crystal, das ist ein Objekt, kein Array von Objekten. Die Elemente/Elemente in einem Objekt haben keine Reihenfolge, dh ihre Reihenfolge ist nicht festgelegt. Ein Array von Objekten würde in etwa so aussehen [{name: "1"}, {name: "2"}, {name: "3"}, ...].

    – JohannesK

    20. März 2020 um 21:54 Uhr

1646639121 618 Javascript Array basierend auf einem anderen Array sortieren
Luca di Liello

Warum nicht sowas wie

//array1: array of elements to be sorted
//array2: array with the indexes

array1 = array2.map((object, i) => array1[object]);

Die Kartenfunktion ist möglicherweise nicht in allen Versionen von verfügbar Javascript

  • Was ist, wenn ich das arrayToBeSorted ein Array von Objekten ist, dh: {1: {…}, 2: {…}, 3: {…}, 4: {…}, 5: {…}}? aber das arrayWithReferenceOrder ist nur ein normales Array?

    – Kristall

    28. November 2017 um 0:16 Uhr

  • @sushruth wie sortiert das das Array?

    – hitautodestruct

    19. Mai 2019 um 11:39 Uhr

  • @Crystal, das ist ein Objekt, kein Array von Objekten. Die Elemente/Elemente in einem Objekt haben keine Reihenfolge, dh ihre Reihenfolge ist nicht festgelegt. Ein Array von Objekten würde in etwa so aussehen [{name: "1"}, {name: "2"}, {name: "3"}, ...].

    – JohannesK

    20. März 2020 um 21:54 Uhr

1646639121 755 Javascript Array basierend auf einem anderen Array sortieren
Debabrata Nayak

function sortFunc(a, b) {
  var sortingArr = ["A", "B", "C"];
  return sortingArr.indexOf(a.type) - sortingArr.indexOf(b.type);
}

const itemsArray = [
  {
    type: "A",
  },
  {
    type: "C",
  },
  {
    type: "B",
  },
];
console.log(itemsArray);
itemsArray.sort(sortFunc);
console.log(itemsArray);

964090cookie-checkJavascript – Array basierend auf einem anderen Array sortieren

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

Privacy policy