Добавил хранилище для комментариев, которое имеет вид:
/**
* STATE
*
*/
const state = {
comments: [],
errors: [],
commentsLoaded: false
}
........
comments представляет собой массив объектов комментариев, в котором существует свойство reply, являющееся массивом с такими же объектами комментариев:
Структура для примераcomments: [
{
id: 1,
replies : [
{
id: 2
},
{
id: 3,
replies: [
{
id: 4
}
]
}
]
},
{
id: 5,
replies: []
},
{
id: 6,
replies: []
}
],
Какую задачу я решаю: пользователь может добавить ответ, к какому-то комментарию, соответственно после добавления комментария на сервер, я получаю от сервера добавленный комментарий и делаю commit.
Проблема заключается в том, что я по ID комментария (на который пользователь дал ответ), ищу его в своем массиве и пушу новый комментарий в comment.reply.
Сначала это выглядело так:
ADD_REPLY(state,{comment_id,data}) {
state.comments.find(c => c.id === comment_id).replies.unshift(data);
},
И это работало для глубины вложенности = 1, как только я пытаюсь дать ответ на вложенный комментарий (глубина вложенности > 1) , данная функция уже не работает.
Пытался искать комментарий и с помощью flatMap:
state.comments.flatMap(comment => comment.replies).find(c => c.id === comment_id);
но почему-то flatMap возвращает все, кроме комментария, на который дается ответ (я так понимаю что проблема в том, что последнее вложение функция не показывает).
Пробовал и подобное:
state.comments.flatMap(function loop(node) {
if (node.replies) {
return node.replies.flatMap(loop);
} else {
return [node];
}
})
Но как я понимаю, прямого доступа к объекту я не получаю, а лишь к новому, то есть не могу его изменить.
По мере гуглинга проблемы стал все чаще и чаще встречать сообщения о том, что это не совсем простая задача, да и вообще, надо хранить данные иначе. Как все-таки правильно работать с вложенностью большого уровня?