vacio objetos objeto matriz entre elemento diferencia comparar comparacion buscar array javascript jquery arrays array-difference

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; };