objetos - Calcular la intersección de dos matrices en JavaScript
map javascript (4)
¿Quieres encontrar la intersección de dos matrices?
Podrías usar la intersection()
de Underscore intersection()
. Esto le dará una lista de los valores presentes en ambas matrices.
var commonValues = _.intersection(arr1, arr2);
jsFiddle .
Si no quisieras usar una biblioteca, sería trivial de implementar ...
var commonValues = arr1.filter(function(value) {
return arr2.indexOf(value) > -1;
});
jsFiddle .
Si Array.prototype.filter()
y Array.prototype.indexOf()
no son compatibles con sus plataformas de destino ...
var commonValues = [];
var i, j;
var arr1Length = arr1.length;
var arr2Length = arr2.length;
for (i = 0; i < arr1Length; i++) {
for (j = 0; j < arr2Length; j++) {
if (arr1[i] === arr2[j]) {
commonValues.push(arr1[i]);
}
}
}
jsFiddle .
Esta pregunta ya tiene una respuesta aquí:
Dadas dos matrices de longitud desigual:
var arr1 = ["mike", "sue", "tom", "kathy", "henry"]; //arr1.length = 5
var arr2 = ["howey", "jim", "sue", "jennifer", "kathy", "hank", "alex"]; //arr2.length = 7
¿Cómo puedo encontrar los valores comunes a ambas matrices? En este caso deben devolverse "sue"
y "kathy"
.
Aquí hay una función de intersección basada en Array.prototype.filter
function intersect(a, b) {
var t;
if (b.length > a.length) t = b, b = a, a = t; // indexOf to loop over shorter
return a.filter(function (e) {
return b.indexOf(e) > -1;
});
}
var arr1 = ["mike", "sue", "tom", "kathy", "henry"];
arr2 = ["howey", "jim", "sue", "jennifer", "kathy", "hank", "alex"];
intersect(arr1, arr2); // ["sue", "kathy"]
También es posible que desee considerar lo siguiente
var arr1 = [''sue'', ''sue'', ''kathy''],
arr2 = [''kathy'', ''kathy'', ''sue''];
Lo anterior ahora daría ["sue", "sue", "kathy"]
. Si no desea duplicados, podría hacer un filtro adicional sobre esto. Esto también estandarizaría los resultados. es decir
return a
.filter(/* .. */) // same as before
.filter(function (e, i, c) { // extra step to remove duplicates
return c.indexOf(e) === i;
});
Agregar esto ahora devolverá el mismo resultado que los arreglos anteriores ( ["sue", "kathy"]
), aunque hubiera duplicados.
Iterar sobre una de las matrices y comparar los objetos con la otra:
var results = [];
for (var i = 0; i < arr1.length; i++) {
if (arr2.indexOf(arr1[i]) !== -1) {
results.push(arr1[i]);
}
}
Podrías usar Array.filter :
var result = arr1.filter(function(n) {
return arr2.indexOf(n) > -1;
});