如何使用Javascript获取包含重复值的数组

如何使用Javascript获取包含重复值的数组,javascript,lodash,Javascript,Lodash,我需要像lodash.intersectionWith这样的东西,但我还需要结果数组中的重复值 例如: var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }]; var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; _.intersectionWith(objects, others, _.isEqual); 预期结果: [{ 'x': 1, '

我需要像lodash.intersectionWith这样的东西,但我还需要结果数组中的重复值

例如:

var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];
var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
_.intersectionWith(objects, others, _.isEqual);
预期结果:

[{ 'x': 1, 'y': 2 },{ 'x': 1, 'y': 2 }]

提前谢谢

使用
reduce
验证第一个
数组中的每个
对象
,然后检查第二个
数组中是否存在该
对象
。如果它存在,
reduce
对象
推入其
数组

reduce
函数将自动返回新的
array

var objects=[{'x':1,'y':2},{'x':2,'y':1},{'x':1,'y':2}];
var others=[{x':1,'y':1},{x':1,'y':2}];
var res=objects.reduce(
功能(arr、obj){
if(包含对象(对象、其他))
方位推力(obj);
返回arr;
}, 
[]
);
函数containsObject(对象,列表){
var x;
var-ret=false;
list.forEach(函数){
ret=JSON.stringify(s)==JSON.stringify(obj);
});
返回ret;
}

控制台日志(res)您可以通过从第一个数组中筛选出与第二个数组中的项目不匹配的项目来找到交叉点。第一个数组中的任何副本都将保留

var intersectwith=函数(f,xs,ys){
返回xs.filter(函数(x){
返回y.some(函数(y){
返回f(x,y);
});
});
};
var等于函数(x,y){
返回x==y;
};
log(intersectwith(等于[1,2,3],[1,1,2,2,4]);
log(intersectwith(等于[1,1,2,2,4],[1,2,3])
您可以利用来获取源
对象
之间的差异,以及源
对象
其他
对象的对称差异

var objects=[{'x':1,'y':2},{'x':2,'y':1},{'x':1,'y':2}];
var others=[{x':1,'y':1},{x':1,'y':2}];
var intersection=u.intersectionWith(对象,其他,u.isEqual);
var结果=u0.differenceWith(
物体,
_.xorWith(对象、其他、相等),
_isEqual先生
);
document.write(“”+JSON.stringify(结果,0,4)+“”)

不太清楚为什么您希望该对象有2个副本而不是3个。因为数组#1有2个值与数组#2匹配,我想我喜欢这种方法,但有一个问题,我实际的数组有不同的对象类型“对象是Jquery”和“其他是javascript对象”。问题是,comparator函数在某些点切换参数(不知道为什么)。@Mikhail请检查我的更新,我改为.intersectionWith()工作正常。我做了一个测试,您可以检查它。我可以看到,在您的中,源
对象
只包含
x
y
属性。你应该加上这样的陈述。你的测试肯定失败了。如果记录交叉点
结果
,它将返回一个空数组。但无论如何,这只是为了看到异或和交集比较器函数之间的区别。您可以使用不同的比较函数,例如
\uuq.isEqual
。我想在代码片段中显示它的工作状态。编辑后添加JSFIDLE,用对象显示它的工作状态。
var result = _.differenceWith(
  objects, 
  _.xorWith(objects, others, _.isEqual), 
  _.isEqual
);