仅从javascript中的数组列表中获取公共对象
我的javascript代码中有几个数组(我也在使用knockout js),我希望得到一个只包含所有数组的公共对象的数组 我的代码是这样的:仅从javascript中的数组列表中获取公共对象,javascript,jquery,arrays,Javascript,Jquery,Arrays,我的javascript代码中有几个数组(我也在使用knockout js),我希望得到一个只包含所有数组的公共对象的数组 我的代码是这样的: Array1 = [{a: 1, b: 'something'}, {a: 2, b: 'something1'},{a: 3, b: 'something3'}]; Array2 = [{a: 3, b: 'something3'}, {a: 1, b: 'something'}, {a: 4, b: 'something4'}] Array2 =
Array1 = [{a: 1, b: 'something'}, {a: 2, b: 'something1'},{a: 3, b: 'something3'}];
Array2 = [{a: 3, b: 'something3'}, {a: 1, b: 'something'}, {a: 4, b: 'something4'}]
Array2 = [{a: 3, b: 'something3'}, {a: 1, b: 'something'}, {a: 5, b: 'something5'}]
Array4 = [{a: 1, b: 'something'}, {a: 3, b: 'something3'}]
Array0 = [Array1, Array2, Array3];
因此,从这个数组中,我希望将所有的公共项合并到一个数组中,结果如下:
Array1 = [{a: 1, b: 'something'}, {a: 2, b: 'something1'},{a: 3, b: 'something3'}];
Array2 = [{a: 3, b: 'something3'}, {a: 1, b: 'something'}, {a: 4, b: 'something4'}]
Array2 = [{a: 3, b: 'something3'}, {a: 1, b: 'something'}, {a: 5, b: 'something5'}]
Array4 = [{a: 1, b: 'something'}, {a: 3, b: 'something3'}]
Array0 = [Array1, Array2, Array3];
我必须指出,Array1、Array2和Array3位于另一个数组中,如下所示:
Array1 = [{a: 1, b: 'something'}, {a: 2, b: 'something1'},{a: 3, b: 'something3'}];
Array2 = [{a: 3, b: 'something3'}, {a: 1, b: 'something'}, {a: 4, b: 'something4'}]
Array2 = [{a: 3, b: 'something3'}, {a: 1, b: 'something'}, {a: 5, b: 'something5'}]
Array4 = [{a: 1, b: 'something'}, {a: 3, b: 'something3'}]
Array0 = [Array1, Array2, Array3];
我希望你能帮我,谢谢 似乎您需要编写一些自定义代码来使用javascript(类似于)进行对象比较,然后使用数组相交算法(类似于前面提到的海报之一)来查找公共元素。例如:
Array1 = [{a: 1, b: 'something'}, {a: 2, b: 'something1'},{a: 3, b: 'something3'}];
Array2 = [{a: 3, b: 'something3'}, {a: 1, b: 'something'}, {a: 4, b: 'something4'}]
Array3 = [{a: 3, b: 'something3'}, {a: 1, b: 'something'}, {a: 5, b: 'something5'}]
all = [Array1, Array2, Array3]
objects = {}
counter = {}
all.map(function(ary, n) {
ary.map(function(obj) {
var key = JSON.stringify(obj);
objects[key] = obj;
counter[key] = (counter[key] || 0) | (1 << n);
})
})
intersection = []
Object.keys(counter).map(function(key) {
if(counter[key] == (1 << all.length) - 1)
intersection.push(objects[key]);
})
console.log(intersection)
Array1=[{a:1,b:'something'},{a:2,b:'something1'},{a:3,b:'something3'}];
Array2=[{a:3,b:'something3'},{a:1,b:'something'},{a:4,b:'something4'}]
Array3=[{a:3,b:'something3'},{a:1,b:'something'},{a:5,b:'something5'}]
全部=[Array1,Array2,Array3]
对象={}
计数器={}
all.map(函数(ari,n){
ary.map(功能(obj){
var key=JSON.stringify(obj);
对象[键]=对象;
计数器[键]=(计数器[键]| | | 0)|(1你说的是“所有人的共同点”,但是你在结果中包含了一些东西3,而只有2个数组。这是一个打字错误,或者如果它在2个数组中,你想添加一些东西吗?看看JS中的reduce函数,如果你努力的话,应该可以完成这项工作,但是下划线会使它更容易。哦..对不起,这是一个错误..我现在正在更正,谢谢你!你是int吗是否需要对对象进行深入比较?{a:1,b:“something”}
每次都是相同的引用对象,还是具有相同属性的单独对象?可能重复?(但这不是jQuery解决方案--我不知道jQuery是否能使这项工作比POJS更容易)小心不要在太大的数据集合上运行它。@naugtur:为什么?据我所知,性能是线性的。我想我担心的是从对象生成大字符串,然后将它们用作多个集合中的键。结果可能会占用大量内存,但我没有测试它-我的不好。无论如何,这与时间复杂性无关。@thg435 I如果我的数组中有30多个项目,交叉点
数组抛出一个空数组。这太棒了,非常感谢!我四处寻找一个简单的解决方案,非常感谢!