Удалить указанный c объект с идентификатором - PullRequest
2 голосов
/ 04 февраля 2020

У меня есть массив объектов, мне нужно удалить полный объект на основе идентификатора

Ввод:

 filters: [
    {
      key: "status",
      label: "En attente",
      value: "waiting",
      id: 0
    },
    {
      key: "dateDue[min]",
      label: "15/12/2019",
      value: "15/12/2019",
      id: 1
    },
    {
      key: "dateDue[max]",
      label: "02/02/2020",
      value: "02/02/2020",
      id: 2
    },
    {
      key: "bien",
      values: [
        {
          label: "Studio Bordeaux",
          value: 36,
          id: 3
        },
        {
          label: "Studio 2",
          value: 34,
          id: 184
        }
      ]
    },
    {
      key: "type",
      values: [
        {
          type: "receipts",
          label: "Loyer",
          value: "loyer",
          id: 4
        },
        {
          type: "receipts",
          label: "APL",
          value: "apl",
          id: 5
        },
        {
          type: "spending",
          label: "taxes",
          value: "taxes",
          id: 6
        }
      ]
    }
  ]

Поэтому я создал метод removeItem с идентификатором, который должен быть удалено в параметрах

метод removeItem:

removeItem = (e, id) => {
const { filters } = this.state;

const remove = _.reject(filters, el => {
  if (!_.isEmpty(el.values)) {
    return el.values.find(o => o.id === id);
  }
  if (_.isEmpty(el.values)) {
    return el.id === id;
  }
});
this.setState({
  filters: remove
});

};

Я использую loda sh, чтобы упростить свою работу и более конкретно _.reject Моя проблема заключается в следующее: мне удается правильно удалить объекты classi c, например

{
  key: "status",
  label: "En attente",
  value: "waiting",
  id: 0
}

, но мой метод, однако, не работает для объектов следующей формы

   {
      key: "bien",
      values: [
        {
          label: "Studio Bordeaux",
          value: 36,
          id: 3
        },
        {
          label: "Studio 2",
          value: 34,
          id: 184
        }
      ]
    },

в настоящее время весь объект удаляется не только объект в массиве значений в соответствии с его идентификатором

Вот мои коды и коробка!

Заранее благодарю за помощь

Ответы [ 3 ]

2 голосов
/ 04 февраля 2020

Вам нужно будет отфильтровать массив filters и каждый values отдельно. Ниже приведена рекурсивная функция, которая удаляет элементы с заданным идентификатором из массива фильтров и из свойства values.

PS. Этот пример не использует Loda sh, так как я думаю, что в этом случае он не нужен.

  removeIdFromCollection = (collection, id) => {
    return collection.filter(datum => {
      if (Array.isArray(datum.values)) {
        datum.values = this.removeIdFromCollection(datum.values, id);
      }

      return datum.id !== id;
    });
  }

  removeItem = (e, id) => {
    const { filters } = this.state;

    this.setState({
      filters: this.removeIdFromCollection(filters, id),
    });
  };
1 голос
/ 04 февраля 2020

Проблемой будет структура объекта. Вам потребуется рефакторинг для этого неудобного массива из ниоткуда для единообразия:

// Example
filters: [
...
{
  key: "type",
  values: [
    {
      type: "receipts",
      label: "Loyer",
      value: "loyer",
      id: 4
    },
    ...
  ]
...
}

// could be

filters: [
...
{
 key: "type-receipts",
 label: "Loyer",
 value: "loyer",
 id: 4
}
...
]

Повторите шаблон для всего этого, чтобы вы могли просто использовать собственный фильтр массива, как этот:

const newFilters = filters.filter(v => v.id !== id);

this.setState({
  filters: newFilters,
});
0 голосов
/ 05 февраля 2020

Я нашел решение с loda sh, делюсь им с вами здесь:

  removeIdFromCollection = id => {
    const { filters } = this.state;
    const newFilters = [];
    _.map(filters, filter => {
      if (filter.values) {
        const valuesTmp = _.compact(
          _.map(filter.values, value => {
            if (value.id !== id) return value;
          })
        );
        if (!_.isEmpty(valuesTmp)) {
          return newFilters.push({
            key: filter.key,
            values: valuesTmp
          });
        }
      }
      if (filter.id && filter.id !== id) return newFilters.push(filter);
    });
    return newFilters;
  };

  removeItem = id => e =>
    this.setState({
      filters: this.removeIdFromCollection(id)
    });

Вот мои обновленные коды и коробка

Edit here

...