我很可能以错误的方式解决这个问题,但我有一个主要数组,如果它的任何对象值存在于另外两个数组中,我需要对其进行过滤。我正在尝试使用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
应该是过滤结果,其中数组由不在milestonesToCreate
和milestonesToDelete
希望我已经很好地解释了这一点。
增加样本里程碑阵列
milestones = [
{
"milestoneId": 0
}
]
答案 0 :(得分:0)
首先,看起来您的问题只是在对some()
的最终调用中对布尔检查的误解。
你已经把:
item.milestoneId === milestonesToCreate.milestoneId && milestonesToDelete.milestoneId
与相同,其中item.milestoneId等于milestonesToCreate.milestoneId和milestonesToDelete.milestoneId存在。我希望你只是想检查两个数组中是否存在当前值。
答案 1 :(得分:0)
最好在单程中实现这一目标:
elementsToUpdate
,将this
中的所有元素复制到elementsToDelete
elementsToUpdate
,一旦某个项目在另一个列表中不存在,请将该元素移至elementsToCreate
elementsToDelete
中删除。
如果不使用数组,而是使用hash(旧的好{}
),而id用作键,你甚至可以更快地加速代码。然后检查“元素是否在这里”就像item in elementsToUpdate
一样简单,而不是每次迭代所有元素