JavaScript如何基于user_id数组将对象数组拆分为匹配与不匹配两组
问题原因
你当前代码无法正常筛选的核心问题有2个:
users变量存在多余的一层数组嵌套,结构为[ [用户对象1, 用户对象2, ...] ],直接对users调用reduce遍历的时候,每次拿到的userRecord是整个内层数组,无法读取到单个用户的key属性,导致全部进入不匹配分组。- (可选优化点)直接使用数组的
includes方法查询匹配的时间复杂度是O(n),当user_id数据量较大时查询效率较低,可以转成Set后使用has方法查询,时间复杂度降为O(1)。
修正后的代码
你可以选择拆掉users多余的嵌套层,或者在遍历的时候扁平化数组:
// 原嵌套结构的users保留的话,用flat()拍平数组即可 const users=[[{_id:"5fbfa729fc46a415ce5503a6",first_name:"Allen",last_name:"Border",timestamp:1606395689121,key:["5fbf6f91aff7f3320a906547","5fbfa748fc46a415ce5503a8"]},{_id:"5fbfa6fbfc46a415ce5503a4",first_name:"james",last_name:"roger",timestamp:1606395689125},{_id:"5fbf6f91aff7f3320a906547",first_name:"david",last_name:"gosh",timestamp:1606395689130,key:["5fbfa729fc46a415ce5503a6"]},{_id:"5e4e74eb380054797d9db623",first_name:"Ricky",last_name:"bichel",timestamp:1606395689131}]] const user_id=["5fbfa748fc46a415ce5503a8", "5fbf6f91aff7f3320a906547"] const userIdSet = new Set(user_id) const {matching, nonMatching} = users.flat().reduce((acc, userRecord) => { // 用可选链和空值合并运算符简化逻辑,兼容无key字段的用户 const isMatch = userRecord.key?.some(key => userIdSet.has(key)) ?? false isMatch ? acc.matching.push(userRecord) : acc.nonMatching.push(userRecord) return acc }, {matching: [], nonMatching: []}) console.log(matching) // 输出结果为Allen对应的用户对象,符合匹配规则
如果你不想保留users的嵌套结构,直接把外层多余的中括号去掉即可,遍历的时候就不需要调用flat()了。
内容的提问来源于stack exchange,提问作者simon
相关产品推荐
相关产品推荐

