如何使用splice方法删除数组中匹配指定条件的对象元素?
实现方法
首先明确你的代码存在3个核心问题:
user.indexOf(one.members[0])的调用逻辑错误:user数组存储的是用户对象,而非字符串ID,传入字符串查找索引永远返回-1,splice传入-1会误删数组最后一位元素,无法匹配目标对象filter方法不会修改原数组,会返回符合条件的新数组,你之前的代码没有接收返回值,所以逻辑不生效- 不该用
map执行副作用操作,map是用来转换数组返回新结果的API,遍历执行修改操作应该用forEach
推荐方案(filter实现,简洁无副作用)
先批量收集需要排除的ID,再一次性过滤数组,性能和可读性都更好:
// 收集array1中所有需要排除的用户ID const excludeIds = array1.flatMap(item => item.members); // 过滤得到符合要求的新数组,注意如果是mongoose返回的文档,_id是ObjectId类型,需要转字符串比较 const filteredUser = user.filter(entry => !excludeIds.includes(entry._id.toString()));
原splice逻辑修复方案
如果要保留修改原数组的逻辑,调整代码如下:
let user = await User.find({ _id: { $ne: req.user._id } }) const getNonfriends = (one) => { const targetId = one.members[0]; // 查找目标ID对应的数组索引 const targetIndex = user.findIndex(entry => entry._id.toString() === targetId); // 匹配到才执行删除 if(targetIndex !== -1) { user.splice(targetIndex, 1); } } // 用forEach遍历执行操作 array1.forEach(getNonfriends)
内容的提问来源于stack exchange,提问作者Mahmudul Murad
相关产品推荐
相关产品推荐

