簡體   English   中英

使用some()根據多個數組過濾一個數組

[英]filter an array based on multiple arrays using some()

我很有可能會以錯誤的方式進行處理,但是我有一個主數組,如果它的任何對象值都存在於另外兩個數組中,則需要過濾該主數組。 我正在嘗試使用filter()some()的組合,但是我現在無法使用。

const milestones = <FormArray>this.piForm.get('_milestones');
if (this.piById) {
    milestonesToCreate = milestones.value
        .filter(milestone => !this.piById.milestones.some(item => item.milestoneId === milestone.milestoneId));
    milestonesToDelete = this.piById.milestones
        .filter(milestone => !milestones.value.some(item => item.milestoneId === milestone.milestoneId));
    milestonesToUpdate = milestones.value
        .filter(milestone => milestones.value
            .some(item =>
                item.milestoneId === milestonesToCreate.milestoneId && milestonesToDelete.milestoneId));
}

在上面的代碼中milestonesToUpdate應該是經過過濾的結果,其中數組由不在milestonesToCreatemilestonesToDelete的對象組成

希望我已經解釋得足夠好了。

添加示例里程碑數組

milestones = [
  {
    "milestoneId": 0
  }
]

首先,看起來您的問題只是對您對some()最終調用中布爾檢查的誤解。

您已輸入:

item.milestoneId === milestonesToCreate.milestoneId && milestonesToDelete.milestoneId

這與說相同, 其中item.milestoneId等於MilestonesToCreate.milestoneId,而MilestonesToDelete.milestoneId存在 我希望您只是嘗試檢查兩個數組中是否都存在當前值。

最好一次通過即可實現:

  1. 把所有元素elementsToUpdate ,從您的副本的所有元素thiselementsToDelete
  2. 遍歷elementsToUpdate ,一旦另一個列表中不存在某項,則將該元素移到elementsToCreate
  3. 如果兩個元素都存在,則將其從elementsToDelete刪除。
    1. 最終,您將獲得3個需要的列表。

而且,如果使用id用作鍵的hash(old good {} )而不是使用數組,甚至可以提高代碼的速度。 然后檢查“如果元素在這里”將與item in elementsToUpdate一樣容易,而不是每次都迭代所有元素

暫無
暫無

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

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