Удаление элемента, когда пользователь отменяет выбор элемента плоского списка - PullRequest
0 голосов
/ 05 августа 2020

Я знаю, что заголовок недостаточно ясен, но я постараюсь объяснить здесь больше. У меня есть плоский список, в котором я должен выбрать несколько элементов и создать строковое значение, содержащее идентификатор элемента и цену элемента, которые я должен отправить на сервер. это мой подход: (он работает нормально)

  selectItem = data => {
    let test = 130;
    if (data.Unites < test) {
      data.Etat = 0
      console.warn('points insufisants');
    } else {
      data.isSelect = !data.isSelect;
      data.selectedClass = data.isSelect ? StylesGift.validChek : StylesGift.inValidChek;
      const newItem = {
        idCadeau: data.idCadeau,
        Unites: data.Unites,
      };

      if (data.isSelect) {
        const index = this.state.paramsSend.indexOf([newItem]);

        this.setState({
          paramsSend: this.state.paramsSend.concat([newItem]),
        }, () => {
          let str = this.state.paramsSend.map(v => Object.values(v).join('_')).join(',')
          this.setState({
            params: str,
          });
        });
      }else if (data.isSelect === false) {
        const index = this.state.paramsSend.indexOf([newItem]);
        if (index > -1) {
          array.splice(index, 1);
          let str = this.state.paramsSend.map(v => Object.values(v).join('_')).join(',')
          this.setState({
            params: str,
          });
        }

   

        console.log('looog' + this.state.paramsSend);
      }
    }
    this.setState({changed: !this.state.changer})

  };

Моя проблема в том, что когда я отменяю выбор элемента, я не могу удалить идентификатор и цену элемента с помощью этого кода:

    else if (data.isSelect === false) {
        const index = this.state.paramsSend.indexOf([newItem]); <-- =-1
        if (index > -1) {
        this.state.paramsSend.splice(index, 1);
let str=this.state.paramsSend.map(v=>Object.values(v).join('_')).join(',')
              this.setState({
                params: str,
              });
            }
            console.log('looog' + this.state.paramsSend);
          }

любое предложение, пожалуйста? indexOf return -1 Я не знаю, почему

const index = this.state.paramsSend.indexOf([newItem]);
console.warn('index ' + index);
console.warn('from this ' +JSON.stringify(this.state.paramsSend));
console.warn('remove this ' + JSON.stringify(newItem));

newItem уже находится в paramsSend, но возвращает -1! введите описание изображения здесь

Ответы [ 2 ]

1 голос
/ 05 августа 2020

у вас есть 2 проблемы:

  1. не вызывайте indexOf с массивом, а только с элементом, который вы ищете: const index = this.state.paramsSend.indexOf(newItem);
  2. * 1008 Вызов * для массива объектов работает, только если item аргумент является фактическим объектом в массиве, а не копией. т.е. это не сработает: const index = this.state.paramsSend.indexOf({ idCadeau: 5, Unites: 180 }); даже если в массиве существует идентичный объект

Таким образом, это должно решить обе проблемы:

const index = this.state.paramsSend.findIndex(item => item.idCadeau === newItem.idCadeau)
if (index > -1) {
  // good!
}
0 голосов
/ 05 августа 2020

Ваш код не очень понятен, но попробуйте использовать функцию фильтрации.

Это pu sh в массиве все элементы, соответствующие условию

const newDataArray = data.filter(elem => elem.idCadeau !== newItem.idCadeau)

Итак, вот, у вас есть новый массив со всеми элементами, которые не совпадают с вашим newItem

...