Arrays basierend auf anderen Arrays sortieren
16. Mai 2020
Sortiere ein Array nach den Vorgaben eines anderen Arrays!
Heute mal mit kleiner Einleitung :-D…bei der von Wagtail (CMS basierend auf Django) bereitgestellten REST API kann man mit dem Parameter ?search
eine Volltextsuche durchführen. Angenommen du hast ein Array wie folgt:
const titles = ['KL500', 'GU200', 'MB210'];
Suchst du nach Beiträgen mit diesen Titeln (die Titel sind in diesem Fall unique identifiers), kannst du die API von Wagtail wie folgt querien:
const posts = axios.get(`/api/posts/?search=${titles.join(' ')}&search_operator=or`);
Axios kümmert sich um die Serialisierung unseres Strings (aus space wird +). Du erhälst alle Beiträge mit den gesuchten Titeln zurück. Jetzt ist es aber auch wichtig, dass die Beiträge so sortiert sind, wie unser titles
Array. Das macht Wagtail nicht, du bekommst die Ergebnisse nach den Titeln alphabetisch sortiert zurück.
Das heißt, wir müssen das Ergebnis unseres Requests anhand des Arrays titles
sortieren:
// wir erstellen zuerst ein Objekt mit allen Beiträgen
// key für die Objekte werden die Titel sein
const postsMap = posts.data.reduce(
(result, current) => ({
...result,
[current.title]: current
}),
{}
);
// jetzt erstellen wir ein neues Array anhand des Arrays titles
const sortedPosts = titles.map(title => postsMap[title]);
Das wars schon! Unsere Beiträge sind nun in sortedPosts
in der gewünschten Reihenfolge 👾