Tengo dos conjuntos de resultados como este:
// Result 1
[
{ value: "0", display: "Jamsheer" },
{ value: "1", display: "Muhammed" },
{ value: "2", display: "Ravi" },
{ value: "3", display: "Ajmal" },
{ value: "4", display: "Ryan" }
]
// Result 2
[
{ value: "0", display: "Jamsheer" },
{ value: "1", display: "Muhammed" },
{ value: "2", display: "Ravi" },
{ value: "3", display: "Ajmal" },
]
El resultado final que necesito es la diferencia entre estas matrices; el resultado final debería ser así:
[{ value: "4", display: "Ryan" }]
¿Es posible hacer algo como esto en JavaScript?
javascript
arrays
object
BKM
fuente
fuente
Respuestas:
Usando solo JS nativo, algo como esto funcionará:
fuente
return a.value ===...
en tu respuesta? (Buena solución, por cierto, +1) Aparte de usarArray.prototype.some()
, realmente no puedo encontrar una forma más eficiente / más corta de hacer esto.true
ofalse
valor). En este caso, si separamos la noción de probar la igualdad del resto del código al requerir que el usuario pase la verificación de igualdad como una función, podemos hacer un algoritmo genérico sencillo.Puede usarlo
Array.prototype.filter()
en combinación conArray.prototype.some()
.Aquí hay un ejemplo (asumiendo que sus matrices están almacenadas en las variables
result1
yresult2
):fuente
Para aquellos a los que les gustan las soluciones de una sola línea en ES6, algo como esto:
fuente
Adopto un enfoque un poco más de propósito general, aunque similar en ideas a los enfoques de @Cerbrus y @Kasper Moerch . Creo una función que acepta un predicado para determinar si dos objetos son iguales (aquí ignoramos la
$$hashKey
propiedad, pero podría ser cualquier cosa) y devuelvo una función que calcula la diferencia simétrica de dos listas basadas en ese predicado:Tiene una pequeña ventaja sobre el enfoque de Cerebrus (al igual que el enfoque de Kasper Moerch) en que se escapa temprano; si encuentra una coincidencia, no se molesta en comprobar el resto de la lista. Si tuviera una
curry
función a mano, haría esto de manera un poco diferente, pero funciona bien.Explicación
Un comentario pidió una explicación más detallada para principiantes. He aquí un intento.
Pasamos la siguiente función a
makeSymmDiffFunc
:Esta función es la forma en que decidimos que dos objetos son iguales. Como todas las funciones que devuelven
true
ofalse
, se puede llamar una "función de predicado", pero eso es solo terminología. El punto principal es quemakeSymmDiffFunc
está configurado con una función que acepta dos objetos y devuelvetrue
si los consideramos iguales,false
si no.Usando eso,
makeSymmDiffFunc
(lea "hacer una función de diferencia simétrica") nos devuelve una nueva función:Esta es la función que realmente usaremos. Le pasamos dos listas y encuentra los elementos en la primera no en la segunda, luego los de la segunda no en la primera y combina estas dos listas.
Sin embargo, volviendo a mirarlo, definitivamente podría haber tomado una pista de su código y simplificar un poco la función principal usando
some
:complement
usa el predicado y devuelve los elementos de su primera lista, no de la segunda. Esto es más simple que mi primer paso con unacontains
función separada .Finalmente, la función principal está envuelta en una expresión de función invocada inmediatamente ( IIFE ) para mantener la
complement
función interna fuera del alcance global.Actualización, unos años después
Ahora que ES2015 se ha vuelto bastante ubicuo, sugeriría la misma técnica, con mucho menos repetición:
fuente
Esto devolverá la diferencia entre dos matrices de objetos, usando la clave
value
para compararlos. Tenga en cuenta que no se devolverán dos cosas con el mismo valor, ya que las otras claves se ignoran.Esto es parte de lodash .
fuente
Puede crear un objeto con claves como el valor único correspondiente a cada objeto en la matriz y luego filtrar cada matriz según la existencia de la clave en el objeto de otro. Reduce la complejidad de la operación.
ES6
ES5
fuente
Creo que la solución @Cerbrus es acertada. Implementé la misma solución pero extraje el código repetido en su propia función (DRY).
fuente
Encontré esta solución usando filtro y algunos.
fuente
La mayoría de las respuestas aquí son bastante complejas, pero ¿no es la lógica detrás de esto bastante simple?
O (n ^ 2) complejidad.
fuente
puede hacer diff a en by diff b en a, luego fusionar ambos resultados
fuente
Hice una diferencia generalizada que compara 2 objetos de cualquier tipo y puede ejecutar un controlador de modificación gist.github.com/bortunac "diff.js" un ejemplo de usar:
por lo que la propiedad a se modifica, b se elimina, c se modifica, d se agrega
}
ahora usa like
la consola mostrará
fuente
Forma más genérica y sencilla:
fuente
Prefiero el objeto de mapa cuando se trata de arreglos grandes.
fuente
JavaScript tiene mapas, que proporcionan tiempo de inserción y búsqueda O (1). Por lo tanto, esto se puede resolver en O (n) (y no en O (n²) como lo hacen todas las demás respuestas). Para eso, es necesario generar una clave primitiva única (cadena / número) para cada objeto. Uno podria
JSON.stringify
, pero eso es bastante propenso a errores, ya que el orden de los elementos podría influir en la igualdad:Por lo tanto, tomaría un delimitador que no aparece en ninguno de los valores y compondría una cadena manualmente:
Luego se crea un mapa. Cuando un elemento ya existe en el mapa, se elimina; de lo contrario, se agrega. Por lo tanto, solo quedan los elementos que se incluyen en tiempos impares (es decir, solo una vez). Esto solo funcionará si los elementos son únicos en cada matriz:
Mostrar fragmento de código
fuente
Me encontré con esta pregunta mientras buscaba una forma de seleccionar el primer elemento en una matriz que no coincide con ninguno de los valores en otra matriz y logré resolverlo eventualmente con array.find () y array.filter () como esta
si necesita seguir obteniendo una lista actualizada antes de verificar la siguiente mejor opción, esto debería funcionar lo suficientemente bien :)
fuente
Si está dispuesto a usar bibliotecas externas, puede usar _.difference en underscore.js para lograrlo. _.difference devuelve los valores de la matriz que no están presentes en las otras matrices.
fuente