tamaƱo recorrer propiedades obtener objetos objeto imprimir diccionario array agregar javascript arrays underscore.js javascript-objects lodash

propiedades - recorrer array de objetos javascript



Comparar dos matrices de objetos y excluir los elementos que coinciden con los valores en una nueva matriz en JS (6)

Aquí está mi caso de uso en JavaScript:

Tengo dos matrices de objetos que tienen propiedades que coinciden (id y nombre).

var result1 = [ {id:1, name:''Sandra'', type:''user'', username:''sandra''}, {id:2, name:''John'', type:''admin'', username:''johnny2''}, {id:3, name:''Peter'', type:''user'', username:''pete''}, {id:4, name:''Bobby'', type:''user'', username:''be_bob''} ]; var result2 = [ {id:2, name:''John'', email:''[email protected]''}, {id:4, name:''Bobby'', email:''[email protected]''} ]; var props = [''id'', ''name''];

Mi objetivo es tener otra matriz de objetos que contenga solo los elementos que no coinciden. Me gusta esto:

var result = [ {id:1, name:''Sandra''}, {id:3, name:''Peter''} ];

Sé que hay una manera de hacerlo yendo del resultado1, compare cada objeto con los objetos del resultado2, luego compare sus claves y, si no coinciden, coloque los valores en otro objeto y luego introdúzcalos en una nueva matriz, pero Me pregunto si hay alguna forma más elegante, como usar lo-dash o subrayado o algo similar.

¡Gracias!


Aquí hay otra solución usando Lodash:

var _ = require(''lodash''); var result1 = [ {id:1, name:''Sandra'', type:''user'', username:''sandra''}, {id:2, name:''John'', type:''admin'', username:''johnny2''}, {id:3, name:''Peter'', type:''user'', username:''pete''}, {id:4, name:''Bobby'', type:''user'', username:''be_bob''} ]; var result2 = [ {id:2, name:''John'', email:''[email protected]''}, {id:4, name:''Bobby'', email:''[email protected]''} ]; // filter all those that do not match var result = types1.filter(function(o1){ // if match found return false return _.findIndex(types2, {''id'': o1.id, ''name'': o1.name}) !== -1 ? false : true; }); console.log(result);


Echa un vistazo a la diferencia y xor en lodash.


El mismo resultado se puede lograr con Lodash.

var result1 = [ {id:1, name:''Sandra'', type:''user'', username:''sandra''}, {id:2, name:''John'', type:''admin'', username:''johnny2''}, {id:3, name:''Peter'', type:''user'', username:''pete''}, {id:4, name:''Bobby'', type:''user'', username:''be_bob''} ]; var result2 = [ {id:2, name:''John'', email:''[email protected]''}, {id:4, name:''Bobby'', email:''[email protected]''} ]; var result3 = _(result1) .differenceBy(result2, ''id'', ''name'') .map(_.partial(_.pick, _, ''id'', ''name'')) .value(); console.log(result3);

<script src="https://cdn.jsdelivr.net/lodash/4.16.4/lodash.min.js"></script>

Puede obtener el resultado deseado aplicando una diferencia entre ambas matrices utilizando las propiedades "id" y "nombre" como una forma de "vincular" elementos entre ellas. Si alguna de esas propiedades es diferente, los elementos se consideran diferentes (de manera improbable en su caso porque la identificación parece ser única).

Por último, debe asignar el resultado para "omitir" las propiedades no deseadas del objeto.

Espero eso ayude.


He buscado mucho una solución en la que pueda comparar dos conjuntos de objetos con diferentes nombres de atributos (algo así como una combinación externa izquierda). Se me ocurrió esta solución. Aquí usé Lodash. Espero que esto ayude.

var Obj1 = [ {id:1, name:''Sandra''}, {id:2, name:''John''}, ]; var Obj2 = [ {_id:2, name:''John''}, {_id:4, name:''Bobby''} ]; var Obj3 = lodash.differenceWith(Obj1, Obj2, function (o1, o2) { return o1[''id''] === o2[''_id''] }); console.log(Obj3); // {id:1, name:''Sandra''}


Simplemente usar los métodos de iteración Array integrados en JS está bien para esto:

var result1 = [ {id:1, name:''Sandra'', type:''user'', username:''sandra''}, {id:2, name:''John'', type:''admin'', username:''johnny2''}, {id:3, name:''Peter'', type:''user'', username:''pete''}, {id:4, name:''Bobby'', type:''user'', username:''be_bob''} ]; var result2 = [ {id:2, name:''John'', email:''[email protected]''}, {id:4, name:''Bobby'', email:''[email protected]''} ]; var props = [''id'', ''name'']; var result = result1.filter(function(o1){ // filter out (!) items in result2 return !result2.some(function(o2){ return o1.id === o2.id; // assumes unique id }); }).map(function(o){ // use reduce to make objects with only the required properties // and map to apply this to the filtered array as a whole return props.reduce(function(newo, name){ newo[name] = o[name]; return newo; }, {}); }); document.body.innerHTML = ''<pre>'' + JSON.stringify(result, null, 4) + ''</pre>'';

Si está haciendo esto mucho, entonces, por supuesto, mire bibliotecas externas para ayudarlo, pero vale la pena aprender lo básico primero, y lo básico le servirá bien aquí.


bueno, esto usando lodash o vanilla javascript depende de la situación.

pero solo para devolver la matriz que contiene los duplicados se puede lograr de la siguiente manera, por supuesto, se tomó de @ 1983

var result = result1.filter(function (o1) { return result2.some(function (o2) { return o1.id === o2.id; // return the ones with equal id }); }); // if you want to be more clever... let result = result1.filter(o1 => result2.some(o2 => o1.id === o2.id));