在array.map()返回对象中添加条件处理undefined实现多数组按ID关联
解决方案
你之前的写法错误点在于把非空判断写在了filter的回调里,如果likes/comments本身是undefined,调用filter方法时就会直接报错,根本执行不到回调内的逻辑。
用ES2020的空值合并运算符??可以直接实现「undefined返回空数组,否则正常执行」的需求,所有可能为空的数组都加一层兜底即可,修正后代码如下:
const newPosts = (posts ?? []).map(post => ({ ...post, // 顶层likes为undefined直接返回空数组,同时兼容单条post下的likes字段为空的情况 likes: (likes ?? []).filter(like => (post.likes ?? []).map(item => item._id).includes(like._id)), comments: (comments ?? []).filter(comment => (post.comments ?? []).map(item => item._id).includes(comment._id)) }))
逻辑说明
??是空值合并运算符,仅当左侧值为undefined/null时才返回右侧的默认值,不会覆盖空数组、0等合法值,完全匹配你的业务要求。- 代码同时做了两层兜底:
- 顶层的
posts/likes/comments为undefined时,直接返回空数组,不会调用数组方法报错 - 单条post下的
post.likes/post.comments为undefined时,也会用空数组兜底,不会执行map时报错
- 顶层的
如果你的运行环境不支持ES2020语法,可以用逻辑或||代替,效果一致:
const newPosts = (posts || []).map(post => ({ ...post, likes: (likes || []).filter(like => (post.likes || []).map(item => item._id).includes(like._id)), comments: (comments || []).filter(comment => (post.comments || []).map(item => item._id).includes(comment._id)) }))
内容的提问来源于stack exchange,提问作者james williams
相关产品推荐
相关产品推荐

