Wie gruppiere ich ein Array?

  • Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Tabula_Rasa

Mitglied
12 Mai 2017
262
2
18
Hallo zusammen,

ich habe folgendes Array als Resultat einer Datenbanksuche zurückbekommen:
Code:
[
  {id:1, description: "Test description", tags: "test1"},
  {id:1, description: "Test description", tags: "test2"},
  {id:1, description: "Test description", tags: "test3"},
  {id:2, description: "Test description", tags: "test1"},
  {id:2, description: "Test description", tags: "test2"}
]

und möchte, dass die "tags" zusammengefasst werden als ein Array bestehend aus strings:

Code:
[
{id:1, description: "Test description", tags: ["test1", "test2", "test3"]},
{id:2, description: "Test description", tags: ["test1", "test2"]}
]

Ich habe schon einiges probiert, aber ich bekomme ein falsches Array. Wie sorge ich am effizientesten dafür, dass im Array nur ein Objekt mit derselben Id existiert und in dem die tags als Array bestehend aus strings zusammengefasst wurden?
 

Sempervivum

Senior HTML'ler
18 Oktober 2016
2.144
428
83
68
Ich würde die Sache so aufziehen:
Code:
    <script>
        const arr = [
            { id: 1, description: "Test description", tags: "test1" },
            { id: 1, description: "Test description", tags: "test2" },
            { id: 1, description: "Test description", tags: "test3" },
            { id: 2, description: "Test description", tags: "test1" },
            { id: 2, description: "Test description", tags: "test2" }
        ];
        let ob = {};
        arr.forEach(item => {
            if (ob[item.id]) {
                ob[item.id].tags.push(item.tags);
            } else {
                ob[item.id] = {
                    'description': item.description,
                    'tags': [item.tags]
                }
            }
        });
        console.log(ob);
Das Objekt, das so entsteht, kannst du dann entweder, wie es ist, verwenden oder in ein Array umwandeln. Ein Objekt habe ich gewählt, weil man dann sehr einfach testen kann, ob die ID schon darin existiert:
if (ob[item.id]) {
 
  • Like
Reaktionen: Tabula_Rasa

Aaron3219

Senior HTML'ler
6 Oktober 2015
1.148
237
63
19
Hier noch eine Alternative mit arr.reduce(). Schließlich ist genau das eines der use cases für diese Funktion.
Javascript:
var arr = [
  {id:1, description: "Test description", tags: "test1"},
  {id:1, description: "Test description", tags: "test2"},
  {id:1, description: "Test description", tags: "test3"},
  {id:2, description: "Test description", tags: "test1"},
  {id:2, description: "Test description", tags: "test2"}
];

var group = (arr, key) => {
  return arr.reduce((acc, cV) => {
    acc[cV[key]] = acc[cV[key]] || {description: cV.description, tags: []};
    acc[cV[key]].tags.push(cV.tags);
    return acc;
  }, {});
};

console.log(group(arr, 'id'));
Du konntest folgende Zeile:
Javascript:
acc[cV[key]] = acc[cV[key]] || {description: cV.description, tags: []};
ersetzen mit:
Javascript:
acc[cV[key]] = null ?? {description: cV.description,tags: []};
Was meiner Meinung nach noch ein wenig eleganter ist. Da nullish coalescing allerdings noch relativ neu ist, solltest du dir vorher den Browser-Support anschauen.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Tabula_Rasa
Werbung: