objetos - find object in array javascript
Compara 2 matrices que devuelve diferencia (10)
De esta forma, no tendrá que preocuparse si la primera matriz es más pequeña que la segunda.
var arr1 = [1, 2, 3, 4, 5, 6,10],
arr2 = [1, 2, 3, 4, 5, 6, 7, 8, 9];
function array_diff(array1, array2){
var difference = $.grep(array1, function(el) { return $.inArray(el,array2) < 0});
return difference.concat($.grep(array2, function(el) { return $.inArray(el,array1) < 0}));;
}
console.log(array_diff(arr1, arr2));
¿Cuál es la forma más rápida / mejor de comparar dos matrices y devolver la diferencia? Al igual que array_diff
en PHP. ¿Hay una función fácil o tendré que crear una a través de each()
? o un bucle foreach
?
En lugar de tirar todo Lodash, puedes usar este ligero componente de código abierto array-diff .
Ejemplo:
diff([1,2,3], [1,2,3,4,5]) // => [4,5]
Funciona mediante la concatenación de las dos matrices aprobadas y el filtrado incluido vals, devolviendo una matriz que representa la diferencia entre las dos matrices.
Esto debería funcionar con matrices sin clasificar, valores dobles y diferentes órdenes y longitudes, al tiempo que le proporciona los valores filtrados de array1, array2 o ambos.
function arrayDiff(arr1, arr2) {
var diff = {};
diff.arr1 = arr1.filter(function(value) {
if (arr2.indexOf(value) === -1) {
return value;
}
});
diff.arr2 = arr2.filter(function(value) {
if (arr1.indexOf(value) === -1) {
return value;
}
});
diff.concat = diff.arr1.concat(diff.arr2);
return diff;
};
var firstArray = [1,2,3,4];
var secondArray = [4,6,1,4];
console.log( arrayDiff(firstArray, secondArray) );
console.log( arrayDiff(firstArray, secondArray).arr1 );
// => [ 2, 3 ]
console.log( arrayDiff(firstArray, secondArray).concat );
// => [ 2, 3, 6 ]
Las operaciones de matriz como esta no son el punto más fuerte de jQuery. Debería considerar una biblioteca como Underscorejs, específicamente la función de diferencia.
Sé que esta es una vieja pregunta, pero pensé que compartiría este pequeño truco.
var diff = $(old_array).not(new_array).get();
diff
ahora contiene lo que estaba en old_array
que no está en new_array
si también desea comparar el orden de la respuesta, puede extender la respuesta a algo como esto:
Array.prototype.compareTo = function (array2){
var array1 = this;
var difference = [];
$.grep(array2, function(el) {
if ($.inArray(el, array1) == -1) difference.push(el);
});
if( difference.length === 0 ){
var $i = 0;
while($i < array1.length){
if(array1[$i] !== array2[$i]){
return false;
}
$i++;
}
return true;
}
return false;
}
use el guión bajo como:
_.difference(array1,array2)
Demo de trabajo http://jsfiddle.net/u9xES/
Buen enlace (documentación de Jquery): http://docs.jquery.com/Main_Page {aquí puede buscar o leer las API}
Espero que esto te ayude si estás buscando hacerlo en JQuery.
La alerta al final solicita la matriz del elemento poco frecuente Array, es decir, la diferencia entre 2 conjuntos.
Por favor, déjame saber si me perdí algo, ¡salud!
Código
var array1 = [1, 2, 3, 4, 5, 6];
var array2 = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var difference = [];
jQuery.grep(array2, function(el) {
if (jQuery.inArray(el, array1) == -1) difference.push(el);
});
alert(" the difference is " + difference); // Changed variable name
/** SUBTRACT ARRAYS **/
function subtractarrays(array1, array2){
var difference = [];
for( var i = 0; i < array1.length; i++ ) {
if( $.inArray( array1[i], array2 ) == -1 ) {
difference.push(array1[i]);
}
}
return difference;
}
A continuación, puede llamar a la función en cualquier lugar de su código.
var I_like = ["love", "sex", "food"];
var she_likes = ["love", "food"];
alert( "what I like and she does''t like is: " + subtractarrays( I_like, she_likes ) ); //returns "Naughty"!
Esto funciona en todos los casos y evita los problemas en los métodos anteriores. ¡Espero que ayude!
var arrayDiff = function (firstArr, secondArr) {
var i, o = [], fLen = firstArr.length, sLen = secondArr.length, len;
if (fLen > sLen) {
len = sLen;
} else if (fLen < sLen) {
len = fLen;
} else {
len = sLen;
}
for (i=0; i < len; i++) {
if (firstArr[i] !== secondArr[i]) {
o.push({idx: i, elem1: firstArr[i], elem2: secondArr[i]}); //idx: array index
}
}
if (fLen > sLen) { // first > second
for (i=sLen; i< fLen; i++) {
o.push({idx: i, 0: firstArr[i], 1: undefined});
}
} else if (fLen < sLen) {
for (i=fLen; i< sLen; i++) {
o.push({idx: i, 0: undefined, 1: secondArr[i]});
}
}
return o;
};