جاوااسکریپت - چگونه بررسی کنیم که یک جفت کلید و مقدار (در یک آرایه) در آرایه دیگری وجود دارد؟


من دو آرایه دارم، به عنوان مثال:

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

و :

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

آرایه invoices یک پاسخ JSON از یک درخواست GET است و گاهی اوقات بزرگتر از result خواهد بود، بنابراین در این مورد invoices شامل Bob است در حالی که در result وجود ندارد.

چگونه میتوانم id هر شیئی را دریافت کنم که Client آن به عنوان Person در result ظاهر نمیشود؟ من سعی کردم این کار را با یک حلقه for دوگانه انجام دهم اما آنطور که باید عمل نکرد.

پاسخ شماره ۱

با تولید یک شیء با کلیدهایی که مقادیر Person از result هستند، میتوانیم از آن برای فیلتر کردن مؤثر مقادیر در invoices استفاده کنیم، و سپس از map استفاده کنیم تا فقط مقادیر id نتیجه فیلتر شده را برگردانیم:

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

پاسخ شماره ۲

شما میتوانید آرایه invoices را فیلتر کنید و از آرایه result به عنوان آرگومان this استفاده کنید و بررسی کنید که آیا هر Client در آن وجود دارد (به MDN برای Array.filter مراجعه کنید). توجه داشته باشید، callback تابع filter باید یک تابع معمولی باشد (یعنی تابع پیکان نباشد) تا بتوانید از آرایه result برای 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; }