[英]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
应该是经过过滤的结果,其中数组由不在milestonesToCreate
和milestonesToDelete
的对象组成
希望我已经解释得足够好了。
添加示例里程碑数组
milestones = [
{
"milestoneId": 0
}
]
首先,看起来您的问题只是对您对some()
最终调用中布尔检查的误解。
您已输入:
item.milestoneId === milestonesToCreate.milestoneId && milestonesToDelete.milestoneId
这与说相同, 其中item.milestoneId等于MilestonesToCreate.milestoneId,而MilestonesToDelete.milestoneId存在 。 我希望您只是尝试检查两个数组中是否都存在当前值。
最好一次通过即可实现:
elementsToUpdate
,从您的副本的所有元素this
为elementsToDelete
elementsToUpdate
,一旦另一个列表中不存在某项,则将该元素移到elementsToCreate
elementsToDelete
删除。
而且,如果使用id用作键的hash(old good {}
)而不是使用数组,甚至可以提高代码的速度。 然后检查“如果元素在这里”将与item in elementsToUpdate
一样容易,而不是每次都迭代所有元素
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.