使用some()过滤基于多个数组的数组

时间:2018-04-01 06:08:55

标签: javascript arrays angular

我很可能以错误的方式解决这个问题,但我有一个主要数组,如果它的任何对象值存在于另外两个数组中,我需要对其进行过滤。我正在尝试使用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
  }
]

2 个答案:

答案 0 :(得分:0)

首先,看起来您的问题只是在对some()的最终调用中对布尔检查的误解。

你已经把:

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

相同,其中item.milestoneId等于milestonesToCreate.milestoneId和milestonesToDelete.milestoneId存在。我希望你只是想检查两个数组中是否存在当前值。

答案 1 :(得分:0)

最好在单程中实现这一目标:

  1. 将所有元素添加到elementsToUpdate,将this中的所有元素复制到elementsToDelete
  2. 迭代elementsToUpdate,一旦某个项目在另一个列表中不存在,请将该元素移至elementsToCreate
  3. 如果两者都存在元素,请将其从elementsToDelete中删除。
    1. 最后,您将获得所需的3个列表。
  4. 如果不使用数组,而是使用hash(旧的好{}),而id用作键,你甚至可以更快地加速代码。然后检查“元素是否在这里”就像item in elementsToUpdate一样简单,而不是每次迭代所有元素