在我的反应状态下,我有一个类似这样的对象数组:
timers:
{
id:"-LL-YVYNC_BGirSn1Ydu"
title: "Project Title"
project: "Project Name",
elapsed: 0,
runningSince: 0,
},
{
id:"-LL-YVYNC_BGirSn1Ydu-2",
title: "Project Title 2"
project: "Project Name",
elapsed: 0,
runningSince: 0,
},
{
id:"-LL-YVYNC_BGirSn1Ydu-3",
title: "Project Title 3"
project: "Project Name 2",
elapsed: 0,
runningSince: 0,
}
有时,我需要批量删除具有相同“项目”的“计时器”,并在没有它们的情况下更新状态。我有一个像这样的数组:
items=["-LL-YVYNC_BGirSn1Ydu", "-LL-YVYNC_BGirSn1Ydu-2"]
包含我需要删除的商品的ID。 我正在使用这种方法来实现结果:
handleDeleteProject = (projectId)=>{
//Creates the array with the id of removing elements
let rObject = this.findTimers(projectId);
for (const key of Object.keys(rObject)){
tObject=[...this.state.timers];
tObject = tObject.filter(timer=>timer.id !== rObject[key]);
this.setState({
timers: tObject
})
}
}
问题在于,对项目进行了过滤,但对于每个循环,“ tObject”具有与起始项目相同的值,因此在循环结束时,我有一个仅由数组中的最后一个ID过滤的对象。 我如何从状态中删除所有项目,带有或不带有“过滤器”。 谢谢。
答案 0 :(得分:2)
let rObject = this.findTimers(projectId);
let values = Object.values(rObject);
let tObject = this.state.timers.filter(timer => values.indexOf(timer.id) === -1);
this.setState({
timers: tObject
});
将解决此问题,仅使用一个过滤器... values
具有所有需要避免的值
编辑:您也可以使用过滤器(timer => !values.includes(timer.id))
代替values.indexOf(...)...