I had to make sure I wasn't missing any events. So I built a concept with a number that counts up with every event. If the numbers aren't consecutive, I know the collection isn't valid.
The solution uses Ramda for functional validation: events get sorted, the numbers extracted, and a reduce checks whether each number is an increment over the previous one.
Dataset
const data = {
'transactions': [{
'transaction': 'A',
'events': [{
'number': 0 // <-- Valid
}, {
'number': 1 // <-- Valid
}]
}, {
'transaction': 'C',
'events': [{
'number': 5 // <-- Valid
}, {
'number': 6 // <-- Valid
}]
}, {
'transaction': 'B',
'events': [{
'number': 3,
}, {
'number': 10, // <-- Nicht valid weil Events fehlen
}]
}]
};
Code
const eventsAreIncrementing = R.pipe(
R.sortBy(R.prop('number')), // Events sortieren
R.map(R.prop('number')), // Liste der Event-Nummern holen
R.reduce((acc, current) => {
if (acc === false) return false; // Skip wenn wir schon einen fehlerhaften Wert gefunden haben
// Für das erste Element das aktuelle zurückgeben
// oder
// Checken ob das aktuelle Element ein Increment vom vorherigen ist
if (acc === null || acc + 1 === current) { return current; }
return false; // False zurückgeben um zu signalisieren dass die Sequenz nicht um 1 inkrementiert
}, null),
R.is(Number) // Reduce gibt false zurück wenn die Nummern nicht aufeinanderfolgend sind, sonst die letzte Nummer
// Deshalb check ich ob das Ergebnis eine Nummer ist
);
const allEventsAreIncrementing = R.pipe(
R.map(R.prop('events')),
R.all(eventsAreIncrementing)
);
const valid = allEventsAreIncrementing(data.transactions);
05.11.2018
updated 27.06.2026