You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 16:27:03