Tengo dos matrices de objetos como:
[{id: "1", name: "item1", checked: true}, {id: "2", name: "item2", checked: true}, {id: "3", name: "item3", checked: true}]y
[{id: "1", name: "item1", checked: true}, {id: "2", name: "item2", checked: true}, {id: "3", name: "item3", checked: false}]La primera matriz contiene los estados predeterminados, la segunda contiene los estados actuales. Me gustaría filtrar los objetos que se cambiaron "marcados". El resultado esperado sería
[{id: "3", name: "item3", checked: false}]Probé con loadash differentBy, pero devuelve una matriz vacía:
const diff=_.differenceBy(array1, array2, "checked")¿Alguien puede ayudar? Gracias.
Podría usar un método como este, si un elemento en la matriz comparado por keyToCompare e identificado por su identificador (en su situación checked e id ).
const differenceBy = (arr1, arr2, keyToCompare, identifier) => { const diff = [] arr1.forEach(arr => { const arr2Item = arr2.find(i => i[identifier] === arr[identifier]) if(arr[keyToCompare] !== arr2Item[keyToCompare]) { diff.push(arr2Item) } }) return diff }Ejemplo:
const arr1 = [{id: "1", name: "item1", checked: true}, {id: "2", name: "item2", checked: true}, {id: "3", name: "item3", checked: true}] const arr2 = [{id: "1", name: "item1", checked: true}, {id: "2", name: "item2", checked: true}, {id: "3", name: "item3", checked: false}] const differenceBy = (arr1, arr2, keyToCompare, identifier) => { const diff = [] arr1.forEach(arr => { const arr2Item = arr2.find(i => i[identifier] === arr[identifier]) if(arr[keyToCompare] !== arr2Item[keyToCompare]) { diff.push(arr2Item) } }) return diff } console.log(differenceBy(arr1, arr2, 'checked', 'id'))Una solución muy compacta -pero O(n^2)- con _.differenceWith :
const xs = [ {id: "1", name: "item1", checked: true}, {id: "2", name: "item2", checked: true}, {id: "3", name: "item3", checked: true} ] const ys = [ {id: "1", name: "item1", checked: true}, {id: "2", name: "item2", checked: true}, {id: "3", name: "item3", checked: false} ] const zs = _.differenceWith(xs, ys, _.isEqual) // [{ id: "3", name: "item3", checked: true }]Un poco más detallado, pero este es O(n):
const xsById = _.keyBy(xs, x => x.id) const zs = ys.filter(y => xsById[y.id]?.checked !== y.checked)Supongo que te vendría bien algo así
function compareArrays(arr1, arr2, keyCompared) { let d = [] arr1.forEach((e,i)=>{ if(e[keyCompared] !== arr2[i][keyCompared]) d.push(e) }) return d }Ejemplo:
let array1 = [{id: "1", name: "item1", checked: true}, {id: "2", name: "item2", checked: true}, {id: "3", name: "item3", checked: true}] let array2 = [{id: "1", name: "item1", checked: true}, {id: "2", name: "item2", checked: true}, {id: "3", name: "item3", checked: false}] function compareArrays(arr1, arr2, keyCompared) { let d = [] arr1.forEach((e,i)=>{ if(e[keyCompared] !== arr2[i][keyCompared]) d.push(e) }) return d } console.log(compareArrays(array1,array2,'checked'))