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; }