Javascript 如何防止数组中的重复项?

Javascript 如何防止数组中的重复项?,javascript,arrays,reactjs,filter,duplicates,Javascript,Arrays,Reactjs,Filter,Duplicates,我有两个数组,我想将一些项从arr1推送到arr2以防止重复,因为我已经向arr2添加了一些也在arr1中的项。我在做这件事 arr1.forEach(q1 => { arr2.forEach(q2 => { if (q1.lessonId !== q2.lessonId) { if (q2.obtainedM

我有两个数组,我想将一些项从arr1推送到arr2以防止重复,因为我已经向arr2添加了一些也在arr1中的项。我在做这件事

                arr1.forEach(q1 => {
                    arr2.forEach(q2 => {
                        if (q1.lessonId !== q2.lessonId) {
                            if (q2.obtainedMarks >= q2.passingMarks) {
                                User.findByIdAndUpdate(req.body.userId, { $push: { arr1: { $each: 
                                    [q2._id] } } }, (err, doc) => {

                                })
                            }
                        }
                    })
                });

可以使用集合而不是数组。它们具有防止重复条目的内置功能。参见

如果项目相同->它们具有相同的参考,请使用
Set
作为Sokushinbutsu的答案

如果没有,请使用
Array.prototype.some()

创建arr1 lessonId的数组,然后使用数组筛选器从arr2中筛选出arr1中已存在的所有内容,然后再次筛选以仅获取通过的项:

//get all lessonId for arr1 in a Set
const arr1Ids = new Set(arr1.map(x=>x.lessonId));
//get items of arr2 that are not already in arr1
const passingArr2NotInArr1 = arr2
  .filter(
    //take out everything that is already in arr1
    item => !arr1Ids.has(item.lessonId)
  )
  .filter(
    //only when it passed
    item => item.obtainedMarks >= item.passingMarks
  );

我不知道您的
用户.findByIdAndUpdate
$push
做什么,但是如果您只想将第二个数组中的非重复项组合到第一个数组中,只有在标记比较起作用时,您才可以这样写:

const addWithoutDups=(arr1,arr2,ids=新集合(arr1.map(x=>x.lessonId))=>
[
……啊,
…arr2.filter((x)=>!ids.has(x.lessonId)&&x.acquiredmarks>x.passingMarks)
]
常数arr1=[
{莱索尼德:1,更多:'这里…'},
{莱索尼德:2,更多:'这里…'},
{莱索尼德:3,更多:'这里…'},
{莱索尼德:4,更多:'这里…'}
]
常数arr2=[
{lessonId:2,获得马克:10,及格分数:7},
{lessonId:3,获得马克:5,及格分数:12},
{lessonId:5,获得马克:10,及格分数:6},
{lessonId:7,获得马克:13,及格分数:8},
{lessonId:11,获得马克:10,及格分数:15},
]
控制台日志(
不带DUP的ADD(arr1、arr2)

)
这是一种低效的过滤方式。对于arr2中的每个项目,您在arr1中进行查找。这不是一种简单的方法吗?在arr1中,有多个对象具有lessonId@AdnanBabai仅使用代码使用的内容:
if(q1.lessonId!==q2.lessonId){
还有一个使用Set的答案可能更快。谢谢@HRM。它起作用了。你能详细解释一下吗。我在理解上遇到了困难。A拥有arr1的所有lessonId,你从arr2中取出arr1中的,然后再次过滤以获得有足够分数的。我会更新我的答案,因为Set可能比map好。先生,在过滤所有条件后,我想将id推到arr1。我怎么办?@AdnanBabai:如果你想变异
arr1
,那么你必须问其他人。我总是喜欢使用不可变的数据。@ScottSauyet尝试在React中变异不是个好主意。我不知道你的其余代码,但我不知道utating arr1似乎不需要。只需像答案中那样使用concat或spread即可。@HMR,这是为OP设计的吗?是的,它是为@Adnanbai设计的,所以在mobile上很难阅读,我(再次)复制了错误的名称
//get all lessonId for arr1 in a Set
const arr1Ids = new Set(arr1.map(x=>x.lessonId));
//get items of arr2 that are not already in arr1
const passingArr2NotInArr1 = arr2
  .filter(
    //take out everything that is already in arr1
    item => !arr1Ids.has(item.lessonId)
  )
  .filter(
    //only when it passed
    item => item.obtainedMarks >= item.passingMarks
  );