Łączenie dwóch tablic po kluczu

0

Cześć,
Chciałbym Was prosić o podpowiedź. Mam sobie dwie tablice, pierwsza:

arr1 = [ { foo: 1, bar: 2, id: ''}, { foo: 3, bar: 4, id: ''}, { foo: 5, bar: 6, id: ''} ];

druga:

arr2 = [ { foo: 1, bar: 2, id: 123, date: 2021-03-17}, { foo: 3, bar: 4, id: 235, date: 2021-03-16}, { foo: 5, bar: 6, id: 323, date: 2021-03-15} ];

Jak widzicie w obu tablicach jest pole id. W pierwszej jest ono puste, w drugiej nie. I teraz to co chcę zrobić, to przepisać do id z arr2 do arr1 łącząc je po parametrze powiedzmy 'foo'. Oczywiście zrobiłem to za pomocą pętli w pętli ale nie bardzo podoba mi się to rozwiązanie. Wydaje mi się był mało eleganckie. Da się to zrobić jakoś w bardziej prawidłowy sposób? Nie chodzi mi o połączenie tych 2 tablic bo jak widzicie w arr2 jest więcej parametrów. Chcę tylko przepisać ten jeden, id.

0

Z punktu widzenia wydajności najbardziej eleganckie rozwiązanie to zrobienie lookup'u czyli najpierw robisz mapę Foo -> Array2 Object korzystając np. ze zwykłego obiektu w JS (ale trzeba pamiętać że tam klucz to zawsze String):

val lookup = Object.create(null); 
for (let el of arr2) {
  lookup[el.foo] = el;
}

Potem iterujesz po Array1 i przepisujesz ID:

for (let el of arr1) {
   if (el.foo in lookup) {
    el.id = lookup[el.foo].id;
  }
}

Kod pisany bez sprawdzenia. Być może twój framework dostarcza ładniejszy typ mapy niż object.

1 użytkowników online, w tym zalogowanych: 0, gości: 1