Złączenie dwóch list o różnych danych

0

Mam dwie listy:
Jedna od 1 do 9
Inna np. Od 3 do 6

Pierwsza konwertuje do listy obiektow z properties : id, name

Pierwsza liste chce zmodyfikowac dla zakresu dodajac kolejny properties np. Age

Rezultat: lista od 1 do 9 z id i name. A od 3 do 6 dodatkowo jeszcze name.

Jak najlepiej mozna to zrobic w typescript zeby nie przesadzic z for loopami?

0

Zawsze jeżeli zadajesz tego typu pytanie, to nie opisuj.

Podaj input i żądany output. To znaczy więcej niż tysiąc słów.

Np.

Cześć, mam taki obiekt:

[
  {
    id: 1,
    name: 'foo',
    address: {
      city: 'Warsaw',
      district: 'Bielany'
    }
  },

  // itd.
]

Chciałbym dostać coś takiego:

{
  'Warsaw': {
    'Wola': [
      {
        id: 1,
        name: 'foo',
        address: {
          city: 'Warsaw',
          district: 'Bielany'
        }
      }
    ]
  },

  // itd.
}

(* dodatkowy opis, dla lubiących czytać *) Czyli pogrupować moje obiekty po mieście, a później po dzielnicy w tym mieście. Jak to zrobić, żeby uniknąć zagnieżdżonych pętli for?

0

Przepraszam, pisalem z telefonu.

[
var a = [1,2,3.... 9]
var b = [3,4,5]

// var a przerabiam na postac:
  {
    id: 1,
    name: 'foo'
  },
 
  // itd. do 9
]

output zmienione 3 elementy w dla elementow od 3 do 5 (według 'b') by powiedzmy wstawic hair:blond

[
  {
    id: 3,
    name: 'foo'
    hair: blond
  },
{
    id: 4,
    name: 'foo'
    age: blond
  },
{
    id: 5,
    name: 'foo'
    age: blond
  },
 
  // dla pozostalych zostaje id i name
]
0
const names = ['Evelynn', 'Kristy', 'Raymonde', 'Niki', 'Gigi', 'Gayle', 'Delfina', 'Helen', 'Micki', 'Danica'];
const a = [1, 2, 3, 4, 5, 6, 7, 8, 9];
const b = [3, 4, 5];

const c = a.map(id => ({
  id,
  name: names[id],
  ...b.indexOf(id) !== -1 && { hair: 'blodnd' }
  
  // lub tak dla zwiększonej czytelności
  // ...(b.indexOf(id) !== -1 && { hair: 'blond' })
  
  // lub tak dla zmniejszonej czytelności
  // ...!!~b.indexOf(id) && { hair: 'blond' }
}));

console.log(c);

... to spread operator. Krótko mówiąc w tym przypadku rozpakowuje obiekt { hair: 'blond' } na klucz i wartość i dodaje go do naszego głownego obiektu. && ma pierwszeństwo przed ..., dlatego najpierw sprawdzany jest warunek, po czym ... jest użyty na obiekcie, albo na boolean ze sprawdzenia.

0
Supplied parameters do not match any signature of call target.
Type '{ hair: string; }' is not an array type.
(method) Array<number>.indexOf(searchElement: number, fromIndex?: number): number 
0

a po prostu w ten sposób nie może być?


const names = ['Evelynn', 'Kristy', 'Raymonde', 'Niki', 'Gigi', 'Gayle', 'Delfina', 'Helen', 'Micki', 'Danica'];
const a = [1, 2, 3, 4, 5, 6, 7, 8, 9];
const b = [3, 4, 5];
 
const c = a.map(id => ({
  id: id,
  name: names[id],
  hair: b.indexOf(id) ? 'blond' : null
}));
 
console.log(c);
0

@Wielki Mleczarz
No b.indexOf(id) ? 'blond' : null jest bez sensu, zwróci false tylko dla id === 3 (bo to pierwszy element tablicy, czyli ma indeks 0, a zero jest traktowane jako false). Nie bez powodu metoda indexOf zwraca -1 w przypadku nie znalezienia elementu.

Zapisz to poprawnie:

b.indexOf(id) !== -1 ? 'blond' : null

lub czyteniej (ES7):

b.includes(id) ? 'blond' : null

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