Digamos que tengo dos matrices de objetos como,
let detail1 = [ {'book':'LOTR','price':'14'} {'book':'Harry pottar','price':'12'}, ] let detail2 = [ {'book':'Harry pottar','price':'15'}, {'book':'LOTR','Price':'14'}, {'book':'HPP','Price':'21'} ]Quiero comparar dos matrices de objetos y devolver verdadero o falso dependiendo de si son iguales o no.
Nota: la estructura del objeto, es decir, la clave, siempre será la misma, su valor puede cambiar o no.
Para esto lo intenté como,
for(let i = 0 ;i<detail1.length; i++){ for(let j = 0; j<detail2.length; j++){ if(JSON.stringify(detail1[i]) === JSON.stringify(detail2[i])){ boolValue = true } else { boolValue = false } } }Pero esto está dando un valor incorrecto, digamos que tengo otra matriz de objetos como,
let detail1 = [ {'book':'LOTR','price':'14'} {'book':'Harry pottar','price':'12'}, ] let detail2 = [ {'book':'Harry pottar','price':'12'}, {'book':'LOTR','price':'14'} ]Pero cuando se cambia el orden, está dando un valor incorrecto.
¿Cuál es la posible solución para comparar dos matrices de objetos y devolver verdadero si son iguales y falso si son diferentes para cualquier caso dada la estructura del objeto, es decir, la clave es la misma?
No puede usar la codificación JSON para verificar la igualdad, porque depende del orden, por ejemplo:
console.log( JSON.stringify({'book':'LOTR','price':'14'}) == JSON.stringify({'price':'14', 'book':'LOTR'}) )Sin embargo, puedes hacer algo como esto:
let detail1 = [ {'book':'LOTR','price':'14'}, {'book':'Harry pottar','price':'12'}, ] let detail2 = [ {'book':'Harry pottar','price':'15'}, {'book':'LOTR','Price':'14'}, {'book':'HPP','Price':'21'} ] function equal(a, b){ return a.length == b.length && // same length and a.every( // every element in a e1 => b.some( // has a match in b e2 => e1.book == e2.book && e1.price == e2.price ) ) } console.log(equal(detail1,detail2), equal(detail1,detail1), equal(detail2,detail2)) Como señaló @TJ Crowder , en realidad puede evitar verificar cada entrada de su objeto manualmente y simplemente usar Object.entries (tenga cuidado de usar esto solo si sus objetos están compuestos solo por cadenas de pares de claves)
let detail1 = [ {'book':'LOTR','price':'14'}, {'book':'Harry pottar','price':'12'}, ] let detail2 = [ {'book':'Harry pottar','price':'15'}, {'book':'LOTR','Price':'14'}, {'book':'HPP','Price':'21'} ] function equal(a, b){ return a.length == b.length && // same length and a.every( // every element in a e1 => b.some( // has a match in b e2 => Object.keys(e1).every(key => e1[key] === e2[key]) ) ) } console.log(equal(detail1,detail2), equal(detail1,detail1), equal(detail2,detail2))Puede lograr fácilmente el resultado usando Object.keys y cada
arr1.length !== arr2.length && arr1.every((o, i) => Object.keys(o).every((prop) => arr2[i][prop] && arr2[i][prop] === o[prop]) ) let detail1 = [ { book: "LOTR", price: "14" }, { book: "Harry pottar", price: "12" }, ]; let detail2 = [ { book: "Harry pottar", price: "15" }, { book: "LOTR", Price: "14" }, { book: "HPP", Price: "21" }, ]; function isEqual(arr1, arr2) { if (arr1.length !== arr2.length) return false; return arr1.every((o, i) => { return Object.keys(o).every((prop) => { return arr2[i][prop] && arr2[i][prop] === o[prop]; }); }); } console.log(isEqual(detail1, detail2));