Задать вопрос

Как перебрать массив из объектов и изменить внутри нужного объекта свойство, которое из себя так же представляет массив из объектов?

Имею вот такую структуру state:
{
  articles: [
    {
      id: '1AAAA',
      title: 'AAAA',
      summary: 'minimalAAA',
      text: 'dsffsfsegrsgsrgsrs',
      comments: [
        { id: '4cdrbdrbvoido',
          name: 'Den',
          comment: 'Ljbelkfei nfien nfien  nfien nfien nfien nfien nfien nfien'},

        {id: '5vjdbnvsjm;slv',
          name: 'Ben',
          comment: 'Ljbelkfei nfien nfien  nfien nfien nfien nfien nfien nfien' }
      ]
    },

    {
      id: '2BBBBB',
      title: 'BBBBB',
      summary: 'minimalBBB',
      text: 'dsffsfsegrsgsrgsrs',
      comments: [
        { id: '1cudohvoido',
          name: 'Sem',
          comment: 'Hnefei nfien nfien  nfien nfien nfien nfien nfien nfien'},

        {id: '2knsdknvpdo',
          name: 'Pen',
          comment: 'Hnefei nfien nfien  nfien nfien nfien nfien nfien nfien'}
      ]
    }
  ]
};

Каждый объект внутри articles это статья со своим уникальным id и остальными данными, в том числе и комментариями к статье внутри comments, которые так же лежат в массиве.
Я создал action, который в reducer передает из переменных только id комментария который нужно удалить из state.

const commentDelete = (idComment) => {
  return {
    type: 'COMMENT_DELETE',
    id:idComment,
  };
};


Не знаю как правильно написать функцию, которая вернет новый state но уже без удаленного комментария. Через стандартный метод state.articles.filter() не получится, возможно нужно внутри метода filter добавить условие или цикл, но я так и не нашел решения.
Думал даже как нибудь изменить структуру state, чтобы так глубоко не лезть внутрь объекта, но не хочется переписывать остальные actions.

Для примера, вот как я делал удаление статьи
case 'ARTICLES_DELETE':
      const delArt = state.articles.filter(user => (user.id !== action.id));
      return {
        ...state,
        articles: [ ...delArt]
      };
  • Вопрос задан
  • 295 просмотров
Подписаться 3 Простой Комментировать
Решения вопроса 1
@StockholmSyndrome
return {
  ...state,
  articles: state.articles.map(({comments, ...o}) => ({
    ...o, 
    comments: comments.filter((c) => c.id !== action.id)
  }))
};
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы