簡體   English   中英

檢查一個對象數組的字段是否從另一個對象數組中丟失

[英]Check if field of one array of objects is missing from another array of objects

假設我們有一系列這樣的對象:

var array1 = 
[
 {first_name: 'Bob', last_name: 'Jones', email: 'bobjones@gmail.com'},
 {first_name: 'Susan', last_name: 'Anderson', email: 'susananderson@gmail.com'}
]

var array2 =
[
 {first_name: 'Bob', last_name: 'Jones', email: 'bobjones@gmail.com'},
 {first_name: 'Susan', last_name: 'Anderson', email: 'susananderson@gmail.com'},
 {first_name: 'John', last_name: 'Smith', email: 'johnsmith@gmail.com'}
]

我想,如果在任何數組2排是基於電子郵件地址缺少檢測,如果它缺少設置一個新的狀態active為false,這樣最終的數組將出來這樣的:

var array3 = [
 {first_name: 'Bob', last_name: 'Jones', email: 'bobjones@gmail.com'},
 {first_name: 'Susan', last_name: 'Anderson', email: 'susananderson@gmail.com'},
 {first_name: 'John', last_name: 'Smith', email: 'johnsmith@gmail.com', active: false}
]

我嘗試遍歷兩個元素中的每個元素,但是事實證明,當數組中有很多元素時,這很慢。

使用forEach循環和filter

 var array1 = [ {first_name: 'Bob', last_name: 'Jones', email: 'bobjones@gmail.com'}, {first_name: 'Susan', last_name: 'Anderson', email: 'susananderson@gmail.com'} ] var array2 = [ {first_name: 'Bob', last_name: 'Jones', email: 'bobjones@gmail.com'}, {first_name: 'Susan', last_name: 'Anderson', email: 'susananderson@gmail.com'}, {first_name: 'John', last_name: 'Smith', email: 'johnsmith@gmail.com'} ] array2.forEach((e)=>{ array1.filter(k=>e.email==k.email).length==0?e.active="false":false; }) console.log(array2) 

您可以使用mapMap

  • 將array1更改為Map ,以便可以在O(1)中完成來自array1的訪問電子郵件
  • 循環訪問array2,根據newMap是否存在電子郵件有條件地添加active密鑰

 let array1 = [{first_name: 'Bob', last_name: 'Jones', email: 'bobjones@gmail.com'},{first_name: 'Susan', last_name: 'Anderson', email: 'susananderson@gmail.com'}] let array2 =[{first_name: 'Bob', last_name: 'Jones', email: 'bobjones@gmail.com'}, {first_name: 'Susan', last_name: 'Anderson', email: 'susananderson@gmail.com'}, {first_name: 'John', last_name: 'Smith', email: 'johnsmith@gmail.com'}] let newMap = new Map(array1.map(({email})=>[email,true])) let final = array2.map(obj=>({ ...obj, ...(!newMap.has(obj.email) && {active: false}) }) ) console.log(final) 

您可以維護一組來自array1的所有電子郵件,然后在array2上使用Array.map()獲得所需的結果:

 let array1 = [ {first_name: 'Bob', last_name: 'Jones', email: 'bobjones@gmail.com'}, {first_name: 'Susan', last_name: 'Anderson', email: 'susananderson@gmail.com'} ] let array2 =[ {first_name: 'Bob', last_name: 'Jones', email: 'bobjones@gmail.com'}, {first_name: 'Susan', last_name: 'Anderson', email: 'susananderson@gmail.com'}, {first_name: 'John', last_name: 'Smith', email: 'johnsmith@gmail.com'} ]; let set = new Set(array1.map(({email})=> email)); let array3 = array2.map(o =>{ if(!set.has(o.email)) o.active = false; return o; }); console.log(array3); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM