循环过滤对象并设置新状态

时间:2018-08-28 13:17:25

标签: javascript reactjs ecmascript-6

在我的反应状态下,我有一个类似这样的对象数组:

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过滤的对象。 我如何从状态中删除所有项目,带有或不带有“过滤器”。 谢谢。

1 个答案:

答案 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(...)...