Ваш Observable испускает массивы, и вы хотите знать разницу между текущим израсходованным массивом и предыдущим. Отслеживание изменений состояния массива больше связано с тем, как сравнивать массивы или объекты, чем с Observables.
Если вы хотите отслеживать изменения в Observable, то все сводится к сравнению предыдущего с текущим значением. Логика c, которую вы хотите использовать здесь, зависит от вас. например, вам нужно подумать о том, как отличить guish между «измененным» значением и вновь «добавленным» значением в массиве?
Вы можете сравнить текущее значение cv
с предыдущим pv
в Observable с использованием pairwise
. Вот как это может выглядеть.
const source = of(
[{ name: "Mark", p: 2 }, { name: "Joe", p: 3 }],
[{ name: "Jean Mark", p: 2 }, { name: "Joe", p: 3 }],
[{ name: "Jean Mark", p: 1 }, { name: "Joe", p: 3 }, { name: 'Alice' }],
[{ name: "Jean Mark", p: 1 }, { name: "Joe", p: 3 }],
[{ name: "Jean Mark", p: 1 }, { name: "Joe", p: 4 }],
[{ name: "Jean Mark", p: 1 }, { name: "Joe", p: 4 }]
);
// compare two objects
const objectsEqual = (o1, o2) =>
typeof o1 === "object" && Object.keys(o1).length > 0
? Object.keys(o1).length === Object.keys(o2).length &&
Object.keys(o1).every(p => objectsEqual(o1[p], o2[p]))
: o1 === o2;
// compare two arrays
// replace this function with your own logic to get your desired output
const difference = (prev, curr) => prev
? {
added: curr.filter(o1 => !prev.some(o2 => objectsEqual(o1, o2))),
removed: prev.filter(o1 => !curr.some(o2 => objectsEqual(o1, o2)))
}
: { added: curr, removed: [] }
source.pipe(
startWith(undefined), // used so that pairwise emits the first value immediately
pairwise(), // emit previous and current value
map(([pv, cv]) => difference(pv, cv)) // map to difference between pv and cv
).subscribe(console.log);
https://stackblitz.com/edit/rxjs-anzyhm