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

JS如何检查数组值是否在对象数组中存在并返回带标识新数组

问题根源

你写的嵌套循环逻辑本身就有问题:外层每遍历1个userData里的用户,内层都会把dataCheck整个遍历一遍,每遍历一个检查项就往结果数组里塞一次值。按你给的示例数据,4个用户、2个待检查值,最后会生成8条重复记录,肯定拿不到想要的结果。
而且内层循环就算已经匹配到了对应名字,也不会停下来,后面遍历到不匹配的检查项时,还会把已经加上status的对象覆盖回原来的结构。

实现方法

不用写嵌套循环,直接用Array.prototype.map遍历原用户数组,对每个用户判断名字是否在待检查列表里就行,代码非常简洁:

const dataCheck = ["Rohit", "Ravi"];
const userData = [
  { name: "Sagar" },
  { name: "Vishal" },
  { name: "Rohit" },
  { name: "Ravi" }
];

const newData = userData.map(user => {
  return dataCheck.includes(user.name)
    ? { ...user, status: "present" }
    : user
});

console.log(newData);

运行后输出的结构和你预期完全一致:

[
  { name: "Sagar" },
  { name: "Vishal" },
  { name: "Rohit", status: "present" },
  { name: "Ravi", status: "present" }
]

如果需要兼容不支持对象扩展运算符的老旧运行环境,把返回匹配项的部分换成Object.assign即可:

const newData = userData.map(user => {
  if (dataCheck.includes(user.name)) {
    return Object.assign({}, user, { status: "present" })
  }
  return user
});
原代码的其他问题
  • 在外层循环外声明共享的newDataValue变量,循环过程中反复重赋值,很容易出现值被意外篡改的问题
  • 没有在匹配到目标值后终止内层循环,做了很多无意义的遍历
  • 每次内层循环都执行push操作,完全没有控制结果数组的长度和原用户数组一致

内容的提问来源于stack exchange,提问作者Sagar Jha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 11:24:38