Vyhledávání na webu

javascript - Jak zjistit, zda pár klíč-hodnota (v poli) existuje v jiném poli?


Mám dvě pole, například:

invoices: [
    {id: 90, Client: 'Bob', paid: false, total: 900},
    {id: 91, Client: 'Sarah', paid: false, total: 400}
]

a :

result: [{km: 200, hours: 20, Person: 'Sarah'}]

Pole invoices je JSON odpověď z GET a někdy bude větší než result, takže v tomto případě má invoices Boba, zatímco v result neexistuje.

Jak mohu získat id všech objektů, jejichž Client se neobjevuje jako Person v result? Snažil jsem se to udělat pomocí dvojitého for cyklu, ale úplně to nefungovalo.

Odpověď č. 1

Vytvořením objektu s klíči, kterými jsou hodnoty Person z result, můžeme tento objekt použít k efektivnímu filtrování hodnot v invoices, a poté použít map k vrácení pouze hodnot id z filtrovaného výsledku:

const invoices =  [
    {id: 90, Client: 'Bob', paid: false, total: 900},
    {id: 91, Client: 'Sarah', paid: false, total: 400}
]

const result =  [{km: 200, hours: 20, Person: 'Sarah'}]

const resindexes = result.reduce((c, o, i) =>
  (c[o.Person] = i, c), {});

ids = invoices.filter(o => resindexes[o.Client] === undefined).map(o => o.id);

console.log(ids);

Odpověď č. 2

Můžete filtrovat pole invoices a použít pole result jako argument this a zkontrolovat jakéhokoli Client v něm (viz MDN pro Array.filter). Poznámka: callback funkce pro filter by měla být normální funkce (tj. ne arrow funkce), aby bylo možné použít pole result jako thisArg.

console.log( `Id(s) not in result\n`, 
  [ {id: 90, Client: 'Bob', paid: false, total: 900}, 
    {id: 91, Client: 'Sarah', paid: false, total: 400},
    {id: 92, Client: 'Mia', paid: false, total: 200} ]
  .filter( 
    function(v) { return !this.find(n => n.Person === v.Client); }, 
    [{km: 200, hours: 20, Person: 'Sarah'}] // <= thisArg
   )
   .map(v => v.id) // <= fetch the found id's
   .join()
);
.as-console-wrapper { top: 0; max-height: 100% !important; }