javascript - objects - Excluye algunas propiedades en comparación usando isEqual() de lodash
lodash pluck (5)
Estoy usando _.isEqual que compara 2 matrices de objetos (por ejemplo: 10 propiedades de cada objeto), y está funcionando bien.
Ahora hay 2 propiedades (creación y eliminación) que no necesito para ser parte de la comparación.
Ejemplo:
var obj1 = {name: "James", age: 17, creation: "13-02-2016", deletion: "13-04-2016"}
var obj2 = {name: "Maria", age: 17, creation: "13-02-2016", deletion: "13-04-2016"}
// lodash method...
_.isEqual(firstArray, secondArray)
La respuesta de @ ryeballar no es ideal para objetos grandes porque crea una copia en profundidad de cada objeto cada vez que realiza la comparación.
Es mejor usar isEqualWith
, por ejemplo,
var result = _.isEqualWith(obj1, obj2, (value1, value2, key) => {
return key === "creation" || key === "deletion" ? true : undefined;
});
Tenga en cuenta que si está escribiendo para ES5 y versiones anteriores, deberá reemplazar la sintaxis de la flecha ( () => {
) con la sintaxis de la function() {
)
Podría map su matriz a una matriz "limpia", y luego compararlas.
// Create a function, to do some cleaning of the objects.
var clean = function(obj) {
return {name: obj.name, age: obj.age};
};
// Create two new arrays, which are mapped, ''cleaned'' copies of the original arrays.
var array1 = firstArray.map(clean);
var array2 = secondArray.map(clean);
// Compare the new arrays.
_.isEqual(array1, array2);
Esto tiene el inconveniente de que la función de clean
deberá actualizarse si los objetos esperan nuevas propiedades. Es posible editarlo para que elimine las dos propiedades no deseadas.
Puede usar omit() para eliminar propiedades específicas en un objeto.
var result = _.isEqual(
_.omit(obj1, [''creation'', ''deletion'']),
_.omit(obj2, [''creation'', ''deletion''])
);
var obj1 = {
name: "James",
age: 17,
creation: "13-02-2016",
deletion: "13-04-2016"
};
var obj2 = {
name: "Maria",
age: 17,
creation: "13-02-2016",
deletion: "13-04-2016"
};
var result = _.isEqual(
_.omit(obj1, [''creation'', ''deletion'']),
_.omit(obj2, [''creation'', ''deletion''])
);
console.log(result);
<script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.min.js"></script>
Veo dos opciones.
1) Haga una segunda copia de cada objeto que no contenga la creación o la fecha.
2) Recorra todas las propiedades y, asumiendo que sabe con certeza que ambas tienen las mismas propiedades, intente algo como esto.
var x ={}
var y ={}
for (var property in x) {
if(property!="creation" || property!="deletion"){
if (x.hasOwnProperty(property)) {
compare(x[property], y[property])
}
}
}
Donde compare () es una simple comparación de cadena u objeto. Si está seguro de las propiedades de uno o ambos objetos, puede simplificar este código un poco más, pero esto debería funcionar en la mayoría de los casos.
_.omit
crea una copia profunda del objeto. Si necesita excluir solo propiedades de raíz, es mejor crear una copia superficial utilizando, por ejemplo, la tarea de desestructuración :
const x = { a: 4, b: [1, 2], c: ''foo'' }
const y = { a: 4, b: [1, 2], c: ''bar'' }
const { c: xC, ...xWithoutC } = x
const { c: yC, ...yWithoutC } = y
_.isEqual(xWithoutC, yWithoutC) // true
xWithoutC.b === x.b // true, would be false if you use _.omit
La mejor manera es no crear copias en absoluto (TypeScript):
function deepEqual(
x?: object | null,
y?: object | null,
ignoreRootProps?: Set<string>
) {
if (x == null || y == null) return x === y
const keys = Object.keys(x)
if (!_.isEqual(keys, Object.keys(y)) return false
for (let key of keys) {
if (ignoreRootProps && ignoreRootProps.has(key)) continue
if (!_.isEqual(x[key], y[key])) return false
}
return true
}