Portrait Michael Malura

Ramda - Validating a Number Sequence

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
Share X Reddit Hacker News LinkedIn E-Mail