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
相关产品推荐
相关产品推荐

