获取多个对象数组之间的现有交集

Get the existing intersections between multiple object arrays

我有几个具有相同 ID 的数组。我想要实现的是在普通 javascript 中获取数组之间的交集,没有库。如果 ID 匹配并且 arraypicklist 值在 2 个或更多数组之间不相等,我应该得到一个具有匹配 ID 的数组。

下面是我尝试过的示例,但最终没有 ID,我预计至少有 1 个匹配项。在这种情况下 Id:123 因为在第一个和第二个数组中存在匹配项。所以我希望

intersection = [{"Id":"123","arrayPicklist":"Categorie__c"},{"Id":"123","arrayPicklist":"Regio__c"}];

fiddle:https://jsfiddle.net/ozckc0tw/4/

var buckets = [[{"Id":"123","arrayPicklist":"Categorie__c"}],
[{"Id":"123","arrayPicklist":"Regio__c"}],
[{"Id":"124","arrayPicklist":"Categorie__c"}],              
[{"Id":"123","arrayPicklist":"Regio__c"},{"Id":"125","arrayPicklist":"Regio__c"},{"Id":"123","arrayPicklist":
"Regio__c"},{"Id":"126","arrayPicklist":"Regio__c"}]]     

                            function IntersectionByKey(key) {
                    var i,
                        j,
                        k,
                        ret = [],
                        item,
                        args = [].slice.call(arguments, 1);

                    args.sort(function(a, b) {return a.length - b.length});                                      
                    i:for(i=0; i<args[0].length; i++) {
                        item = [Object.assign(args[0][i], {})];
                        j:for(j=1; j<args.length; j++) {
                            for(k=0; k<args[j].length; k++) {
                                if(key in args[0][i] && args[0][i][key] == args[j][k][key]){
                                    item.push(Object.assign(args[j][k], {}));
                                    continue j;
                                }
                            }
                            continue i; 
                        }
                        ret.push(item);
                    }
                    return ret;
                }
                var key = 'Id';
                var intersection = IntersectionByKey.apply(null, [key].concat(buckets));


                 console.log('intersection '+JSON.stringify(intersection))

完成,抱歉,我没有看清你的代码,我根据你的要求尝试了我的逻辑,你可以使用它。 my logic

var buckets = [
    [{
      "Id": "123",
      "arrayPicklist": "Categorie__c"
    }],
    [{
      "Id": "123",
      "arrayPicklist": "Regio__c"
    }],
    [{
      "Id": "124",
      "arrayPicklist": "Categorie__c"
    }],
    [{
      "Id": "123",
      "arrayPicklist": "Regio__c"
    }, {
      "Id": "125",
      "arrayPicklist": "Regio__c"
    }, {
      "Id": "123",
      "arrayPicklist": "Regio__c"
    }, {
      "Id": "126",
      "arrayPicklist": "Regio__c"
    }]
  ],
  intersection = [{
    "Id": "123",
    "arrayPicklist": "Categorie__c"
  }, {
    "Id": "123",
    "arrayPicklist": "Regio__c"
  }];
var resArray = [];

for (var j = 0; j < intersection.length; j++) {
  for (var i = 0; i < buckets.length; i++) {
    for (var k = 0; k < buckets[i].length; k++) {
      if (buckets[i][k].Id == intersection[j].Id && buckets[i][k].arrayPicklist == intersection[j].arrayPicklist) {
        resArray.push(buckets[i][k]);

      }
    }
  }

}
console.log(resArray);