Фильтрация объектов в цикле и установка нового состояния - PullRequest
0 голосов
/ 28 августа 2018

У меня есть массив объектов, который похож на этот в моем состоянии реакции:

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"]

содержит идентификаторы предметов, которые мне нужно удалить. Я использую этот метод для достижения результата:

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» имеет одинаковые значения начального элемента, поэтому в конце цикла у меня есть объект, отфильтрованный только по последнему идентификатору в массиве. Как можно убрать все элементы из состояния, с или без «фильтра». Благодаря.

1 Ответ

0 голосов
/ 28 августа 2018
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(...)...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...