简体   繁体   中英

filter an array based on multiple arrays using some()

It's quite possible I am going about this the wrong way, but I have a primary array that i need to filter if any of it's objects values exist in two other arrays. I am trying to use a combination of filter() and some() but what I have right now is not working.

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

In the code above milestonesToUpdate should be a the filtered results where the array consists of objects that are not in milestonesToCreate and milestonesToDelete

Hopefully I've explained this well enough.

ADDED SAMPLE MILESTONES ARRAY

milestones = [
  {
    "milestoneId": 0
  }
]

Firstly, it looks like your problem is just a misunderstanding of boolean checks in your final call to some() .

You have put:

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

Which is the same as saying, where item.milestoneId equals milestonesToCreate.milestoneId AND milestonesToDelete.milestoneId exists . I expect that you are just trying to check if the current value exists in both arrays.

it's better to achieve that in single pass:

  1. put all elements to elementsToUpdate , copy all elements from your this into elementsToDelete
  2. iterate through elementsToUpdate , once some item does not exist in another list, move that element into elementsToCreate
  3. if element exists in both, remove it from elementsToDelete .
    1. finally you will get 3 lists you need.

And you can even speed up code more if instead of using arrays you use hash(old good {} ) where id are used as keys. Then check "if element is here" would be as easy as item in elementsToUpdate instead of iterating all the elements each time

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM