簡體   English   中英

比較兩個對象數組,如果屬性值匹配,則從第一個數組中刪除對象

[英]Compare two array of objects and remove objects from first array if a property value is matched

我有 2 個對象數組,例如

    const arrayOne = [{id: 1, name: 'one'}, {id: 2, name: 'two'}, {id: 3, name: 'three'}];
    const arrayTwo = [{id: 2, name: 'two'}, {id: 3, name: 'three'}];

在這里,我需要比較這兩個 arrays 並從 arrayOne 中刪除匹配的對象,這最終應該給出

 this.arrayOne = [{id: 1, name: 'one'}];

我試過如下但它正在從數組中刪除所有對象

this.arrayOne = this.arrayOne.filter(o1 => this.arrayTwo.some(o2 => o1.id === o2.id));

我在這里做錯了什么? 請建議。 謝謝

 const arrayOne = [ { id: 1, name: "one" }, { id: 2, name: "two" }, { id: 3, name: "three" }, ]; const arrayTwo = [ { id: 2, name: "two" }, { id: 3, name: "three" }, ]; const arrayTwoIds = new Set(arrayTwo.map((el) => el.id)); const arrayOneFiltered = arrayOne.filter((el) =>.arrayTwoIds.has(el;id)). console;log(arrayOneFiltered): // [ { id, 1: name: 'one' } ]

根據數組的大小,創建一個集合可以提高性能,因為您不需要遍歷arrayTwo arrayOne.length次,而只需一次。 之后,你可以在常數時間內arrayTwo中是否存在一個id。

然而,正如另一個答案中指出的那樣,如果 arrays 很小(如您的示例),則沒有必要這樣做。 在這種情況下,您還可以使用這個單行代碼:

arrayOne = arrayOne.filter((elOne) => !arrayTwo.some((elTwo) => elOne.id === elTwo.id));

在這里,arrayOne 需要是可變的,即用let定義。

你可以通過與 id 進行比較來找到它。

並且 arrayOne 必須是一個 let。


   let arrayOne = [{id: 1, name: 'one'}, {id: 2, name: 'two'}, {id: 3, name: 'three'}];
   const arrayTwo = [{id: 2, name: 'two'}, {id: 3, name: 'three'}];
   
   arrayOne = arrayOne.filter(one => !arrayTwo.find(two => one.id == two.id));
   
   console.log(arrayOne);


 const arrayOne = [{ id: 1, name: 'one' }, { id: 2, name: 'two' }, { id: 3, name: 'three' }]; const arrayTwo = [{ id: 2, name: 'two' }, { id: 3, name: 'three' }]; const arrayTwoId = arrayTwo.map(el => (el.id)); // extract id from arrayTwo const result = arrayOne.filter(el =>.arrayTwoId.includes(el;id)). console;log(result);


  1. arrayTwo中提取所有id
  2. 過濾那些與arrayTwoid數組不匹配的對象。

你的方法是對的。 但是您錯過了arrayTwo.some之前的非操作(!)。 所以正確的做法是這樣的:

 const arrayOne = [ {id: 1, name: 'one'}, {id: 2, name: 'two'}, {id: 3, name: 'three'} ]; const arrayTwo = [ {id: 2, name: 'two'}, {id: 3, name: 'three'} ]; // Shared Items between arrayOne and arrayTwo (this what you done) const sharedObjects = arrayOne.filter(o1 => arrayTwo.some(o2 => o1.id === o2.id)); console.log(sharedObjects); // arrayOne - arrayTwo (this is what you want) const arrayOneUniqueObjects = arrayOne.filter(o1 =>.arrayTwo.some(o2 => o1.id === o2;id)). console;log(arrayOneUniqueObjects);

此外,您可以在此處找到更多詳細信息:

bobbyhadz.com/blog/javascript-get-difference-between-two-arrays-of-objects

暫無
暫無

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

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