簡體   English   中英

如何比較兩個不同長度的對象數組?

[英]How to compare 2 arrays of object with different length?

我在角度應用程序上工作,必須比較2個對象數組:

ar1 = [{id: 2, itemId: 1},
    {id: 5, itemId: 3},
    {id: 18,itemId: 13},
    {id: 16,itemId: 14}]

ar2 = [{id: 13, itemId: 1},
    {id: 12, itemId: 14}]

我嘗試做這樣的事情:

for(let i = 0 ; i < this.ar1.length ; i++){
    if(this.ar2[i] != undefined){
        if(this.ar1[i].itemId == this.ar2[i].itemId){
            console.log("in and ==itemId",this.ar2[i])
        }
        else{
            console.log("in and !=itemId",this.ar1[i])
        }
    }
    else{
        console.log("undefined",this.ar1[i])
    }
}

還給我的是:

in and ==itemId {id: 13, itemId: 1}
in and !=itemId {id: 5, itemId: 3}
undefined {id: 18, itemId: 13}
undefined {id: 16, itemId: 14}

我想要一個可以告訴我哪個對象在2個數組中而哪個對象不在2個數組中的函數。

這不是重復的原因,我不想看到2個對象數組之間的差異,但要查看itemId是否相同並獲取具有相同itemId的對象。

您要遍歷兩個數組,以便可以將ar1的所有值與ar2所有值進行比較。

這是運行代碼片段的基本邏輯:

 let ar1 = [ {id: 2, itemId: 1}, {id: 5, itemId: 3}, {id: 18,itemId: 13}, {id: 16,itemId: 14} ]; let ar2 = [ {id: 13, itemId: 1}, {id: 12, itemId: 14} ]; for (let x = 0; x < ar1.length; x++) { for (let y = 0; y < ar2.length; y++) { if (ar1[x].itemId === ar2[y].itemId) { console.log("id: " + ar1[x].id + ", itemId: " + ar1[x].itemId + " = id: " + ar2[y].id + ", itemId: " + ar2[y].itemId); } } } 

您可以通過使用forEach而不是傳統的for循環來進一步簡化此操作。 您還可以更改console.log邏輯以適合您希望輸出的任何數據。

您遍歷了兩個數組,發現它的arr1的id是否存在於arr2中

 ar1 = [{ id: 2, itemId: 1 }, { id: 5, itemId: 3 }, { id: 18, itemId: 13 }, { id: 16, itemId: 14 } ] ar2 = [{ id: 13, itemId: 1 }, { id: 12, itemId: 14 } ] for (let i = 0; i < this.ar1.length; i++) { id = false; for (let j = 0; j < this.ar2.length; j++) { if (this.ar1[i].itemId == this.ar2[j].itemId) { id = true data = this.ar2[j]; } } if (id) { console.log("in and ==itemId", data) } else { console.log("in and !=itemId", this.ar1[i]) } } 

而不是使用傳統for foreach ,它會遍歷數組中的每個元素並檢查數組中的另一個元素。

your.component.ts

export class AppComponent {
  name = 'Angular';

  ar1 = [{ id: 2, itemId: 1 },
  { id: 5, itemId: 3 },
  { id: 18, itemId: 13 },
  { id: 16, itemId: 14 }]

  ar2 = [{ id: 13, itemId: 1 },
  { id: 12, itemId: 14 }]

 constructor () {
   this.compareArray()
 }


  compareArray() {

    this.ar1.forEach( array1Ttem => {

      this.ar2.forEach( array2Item => {

         if(array1Ttem.itemId == array2Item.itemId){
            console.log("in and ==itemId",array1Ttem);
        }
        else{
            console.log("in and !=itemId",array1Ttem);
        }

      })
    })
  }
}

Stackblitz上的解決方案

希望這會有所幫助!

您可以迭代ar1並使用findIndex檢查ar2上是否存在具有相同itemId的對象

 let ar1 = [{ id: 2, itemId: 1 }, { id: 5, itemId: 3 }, { id: 18, itemId: 13 }, { id: 16, itemId: 14 } ] let ar2 = [{ id: 13, itemId: 1 }, { id: 12, itemId: 14 } ] ar1.forEach(function(item) { let findIndexInar2 = ar2.findIndex(function(elem) { return item.itemId === elem.itemId; }) if (findIndexInar2 !== -1) { console.log('itemId present in ar2') } else { console.log('itemId not present in ar2') } }) 

像這樣 :

const ar1 = [
  { id: 2, itemId: 1 },
  { id: 5, itemId: 3 },
  { id: 18, itemId: 13 },
  { id: 16, itemId: 14 },
]

const ar2 = [{ id: 13, itemId: 1 }, { id: 12, itemId: 14 }]
const inTwoArray = []
const notInTwoArray = []
ar1.forEach(el => {
  if (ar2.find(el1 => el1.itemId === el.itemId)) {
    inTwoArray.push(el)
  } else {
    notInTwoArray.push(el)
  }
})

console.log(inTwoArray)
console.log(notInTwoArray)

以下代碼段將幫助您找到您的itemId常見的位置-

 let ar1 = [{ id: 2, itemId: 1 }, { id: 5, itemId: 3 }, { id: 18, itemId: 13 }, { id: 16, itemId: 14 } ]; let ar2 = [{ id: 13, itemId: 1 }, { id: 12, itemId: 14 } ]; let checkCommonElements = function(arr1, arr2) { arr1.forEach((object1, index1) => { let flag = false; arr2.forEach((object2, index2) => { if (object1.itemId === object2.itemId) { flag = true; console.log("Item present in ar2: ", JSON.stringify(object1)); } }); if(!flag) { console.log("Item not in ar2: ", JSON.stringify(object1)); } }); } checkCommonElements(ar1, ar2); 

.includes()怎么樣?

 ar1 = [ {id: 2, itemId: 1}, {id: 5, itemId: 3}, {id: 18, itemId: 13}, {id: 16, itemId: 14}, ]; ar2 = [ {id: 2, itemId: 1}, {id: 5, itemId: 25}, {id: 18, itemId: 13}, {id: 22, itemId: 14}, ]; intersection = ar1.filter(x => ar2.map(y => y.itemId).includes(x.itemId)); console.log(intersection); 

和平

暫無
暫無

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

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