Ecco un algoritmo alternativo che dovrebbe essere flessibile e funzionare meglio. Uno di questi miglioramenti è che puoi specificare la tua funzione di confronto, quindi nel tuo caso puoi semplicemente confrontare l'id se si tratta di un identificativo univoco.
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;
}
Si può usare in questo modo:
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;
});
Oppure si può lasciare fuori la funzione e userà sottolinea la funzione _.isEqual(), in questo modo:
var result = intersectionObjects(a, b, c);
Puoi trovarlo su jsFiddle qui: http://jsfiddle.net/luisperezphd/43vksdn6/
È incredibile che nessuna di queste API consenta di passare una funzione di uguaglianza. – Pointy