i trying create reply to comments in my project, and I have some problems with adding comments to reducer, i am trying to add an reply without reloading the page.
My comments looks at:
[ id: createdAt: text: comments: [ id: createdAt: text: comments: [ id: createdAt: text: comments: [], id: createdAt: text: comments: [] ] ]
It’s my reducer, now i trying write to console:
[sendReplyRoutine.SUCCESS]: (state, action) => { state.reply = initialState.reply; function findById(arr, id, nestingKey) { return arr.find(d => d.id === id) || findById(arr.flatMap(d => d[nestingKey] || []), id, 'comments') || 'Not found'; } console.log(findById(state.post.comments, state.reply.replyCommentId, 'comments')); }
I can’t think of how I can iterate through my array to add a comment to the block I need.
For example this is how i add the usual comment:
[sendCommentRoutine.SUCCESS]: (state, action) => { state.comment = initialState.comment; console.log(action.payload); state.post.comments.unshift(action.payload); }
Advertisement
Answer
If I understood your problem correctly, that might be helpful.
const comments = [ { id: 1, createdAt: '', text: '', comments: [ { id: 2, comments: [ { id: 6, comments: [] } ], }, { id: 3, comments: [ { id: 4, comments: [] }, { id: 5, commensts: [] } ] } ], }, { id: 7, comments: [] } ]; const findById = (id, comments, idx = 0) => { const item = comments[idx]; if (!item) return null; if (item.id === id) return item; const newComments = item.comments.length ? [...comments, ...item.comments] : comments; return findById(id, newComments, idx + 1); }; console.log(findById(5, comments)); console.log(findById(7, comments));