0

When I render an array of objects and try to render component inside map function is gives me this error: Uncaught TypeError: (intermediate value)(intermediate value)(intermediate value).map is not a function The problem occurs here:

{comments.map((obj, i) => (
        <CommentsBlock
          key={i}
          items={{
            user: {
              fullName: obj?.user?.fullName,
              avatarUrl: obj?.user?.avatarUrl,
            },
            text: obj?.text,
          }}
          isLoading={false}
          id={obj._id}
          isEditable={userData._id == obj.user._id}
        ><Index /></CommentsBlock>
      ))}

CommentBlock component:

export const CommentsBlock = ({
  id,
  items,
  children,
  isLoading = true,
  isEditable = false,
}) => {
  const dispatch = useDispatch();
  const onClickRemove = () => {
    if (window.confirm("Вы действительно хотите удалить статью?")) {
      //dispatch(fetchRemovePosts(id));
    }
  };

  return (
    <SideBlock title="Комментарии">
      <List>
        {(isLoading ? [...Array(5)] : items).map((obj, index) => (
          <React.Fragment key={index}>
            <ListItem alignItems="flex-start">
              <ListItemAvatar>
                {isLoading ? (
                  <Skeleton variant="circular" width={40} height={40} />
                ) : (
                  <Avatar alt={obj.user.fullName} src={obj.user.avatarUrl} />
                )}
              </ListItemAvatar>
              {isLoading ? (
                <div style={{ display: "flex", flexDirection: "column" }}>
                  <Skeleton variant="text" height={25} width={120} />
                  <Skeleton variant="text" height={18} width={230} />
                </div>
              ) : (
                <ListItemText
                  primary={
                    <Typography
                      style={{
                        display: "flex",
                        justifyContent: "space-between",
                      }}
                    >
                      {obj.user.fullName}
                      {isEditable ? (
                        <IconButton color="secondary" style={{ padding: 0 }}>
                          <DeleteIcon />
                        </IconButton>
                      ) : (
                        ""
                      )}
                    </Typography>
                  }
                  secondary={obj.text}
                />
              )}
            </ListItem>
            <Divider variant="inset" component="li" />
          </React.Fragment>
        ))}
      </List>
      {children}
    </SideBlock>
  );
};

array comment comes from here

const comments = useSelector((state) => state.comment.data);

that's how comments looks like

So i expect to render these elements

2 Answers 2

2
(isLoading ? [...Array(5)] : items).map((obj, index) 

This line looks very suspicious. You receive loading as prop and set true, and if loading is true [...Array(5)] will be

[undefined, undefined, undefined, undefined, undefined]

Usually, you want to display some loader, if the loading is true. And then below you use obj.user.fullName, but you map over an array with 5 undefineds, so you get

undefined.user.fullName

This is what I can tell from the code, if you add the code to some sandbox and share, I may help more, I don't see the full picture.

Sign up to request clarification or add additional context in comments.

Comments

0

You're passing items as object thru CommentsBlock component props, but in List component you're trying to access as array here: {(isLoading ? [...Array(5)] : items).map((obj, index) => ( which is the reason behind error. Can not run map on object.

So either pass the items as arrau or just access as object directly.

[...Array(5)] is producing array with empty value (undefined) where items is object which not iterable thu map.

Thanks.

1 Comment

Thank you very much, it indeed was a problem now everything is working)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.