Voici un algorithme alternatif qui devrait être plus souple et plus performant. L'une de ces améliorations est que vous pouvez spécifier votre propre fonction de comparaison. Dans votre cas, vous pouvez simplement comparer l'identifiant s'il s'agit d'un identifiant unique.
function intersectionObjects2(a, b, areEqualFunction) {
var results = [];
for(var i = 0; i < a.length; i++) {
var aElement = a[i];
var existsInB = _.any(b, function(bElement) { return areEqualFunction(bElement, aElement); });
if(existsInB) {
results.push(aElement);
}
}
return results;
}
function intersectionObjects() {
var results = arguments[0];
var lastArgument = arguments[arguments.length - 1];
var arrayCount = arguments.length;
var areEqualFunction = _.isEqual;
if(typeof lastArgument === "function") {
areEqualFunction = lastArgument;
arrayCount--;
}
for(var i = 1; i < arrayCount ; i++) {
var array = arguments[i];
results = intersectionObjects2(results, array, areEqualFunction);
if(results.length === 0) break;
}
return results;
}
Vous pouvez l'utiliser comme ceci :
var a = [ { id: 1, name: 'jake' }, { id: 4, name: 'jenny'} ];
var b = [ { id: 1, name: 'jake' }, { id: 9, name: 'nick'} ];
var c = [ { id: 1, name: 'jake' }, { id: 4, name: 'jenny'}, { id: 9, name: 'nick'} ];
var result = intersectionObjects(a, b, c, function(item1, item2) {
return item1.id === item2.id;
});
Ou vous pouvez omettre la fonction et elle utilisera la fonction _.isEqual() soulignée, comme ceci :
var result = intersectionObjects(a, b, c);
Vous pouvez le trouver sur jsFiddle ici : http://jsfiddle.net/luisperezphd/43vksdn6/