Everything works fine, but i have this warning Expected to return a value at the end of arrow function array-callback-return
, i try use forEach
instead map
, but then <CommentItem />
doesn't even show. How fix it?
return this.props.comments.map((comment) => {
if (comment.hasComments === true) {
return (
<div key={comment.id}>
<CommentItem className="MainComment"/>
{this.props.comments.map(commentReply => {
if (commentReply.replyTo === comment.id) {
return (
<CommentItem className="SubComment"/>
) // returnt
} // if-statement
}) // map-function
} // map-function __begin
</div> // comment.id
) // return
The warning indicates that you're not returning something at the end of your map arrow function in every case.
A better approach to what you're trying to accomplish is first using a
.filter
and then a.map
, like this:The most upvoted answer, from Kris Selbekk, it is totally right. It is important to highlight though that it takes a functional approach, you will be looping through the
this.props.comments
array twice, the second time(looping) it will most probable skip a few elements that where filtered, but in case nocomment
was filtered you will loop through the whole array twice. If performance is not a concern in you project that is totally fine. In case performance is important aguard clause
would be more appropriated as you would loop the array only once:The main reason I'm pointing this out is because as a Junior Developer I did a lot of those mistakes(like looping the same array multiple times), so I thought i was worth mention it here.
PS: I would refactor your react component even more, as I'm not in favour of heavy logic in the
html part
of aJSX
, but that is out of the topic of this question.The problem seems to be that you are not returning something in the event that your first
if
-case is false.The error you are getting states that your arrow function
(comment) => {
doesn't have a return statement. While it does for when yourif
-case is true, it does not return anything for when it's false.edit you should take a look at Kris' answer for how to better implement what you are trying to do.
A
map()
creates an array, so areturn
is expected for all code paths (if/elses).If you don't want an array or to return data, use
forEach
instead.The easiest way only if you don't need return something it'ts just
return null