Einführung in Node.js, Folge 25: Let's code (is-subset-of)

the next big thing  –  0 Kommentare

Will man in JavaScript wissen, ob ein Array oder ein Objekt eine Teilmenge eines anderen Arrays oder eines anderen Objekts ist, lässt sich das nicht einfach herausfinden – erst recht nicht, wenn eine rekursive Analyse gewünscht ist. Warum also nicht ein Modul zu dem Zweck entwickeln?

Bei Zahlen, Zeichenketten oder logischen Werten stellt sich die Frage nach der Teilmenge nicht, aber bei Objekten und Arrays durchaus: Gelegentlich kann es hilfreich sein zu erfahren, ob ein Array in einem anderen Array oder ein Objekt in einem anderen Objekt enthalten ist.

Genau das leistet das npm-Modul is-subset-of, dessen Quellcode auf GitHub als Open Source zur Verfügung steht. Das Modul stellt eine Funktion zur Verfügung, die zwei Arrays oder zwei Objekte als Parameter erwartet und überprüft, ob der erste Parameter eine Teilmenge des zweiten ist. Das Ergebnis wird als logischer Wert zurückgegeben:

const isSubsetOf = require('is-subset-of');

console.log(isSubsetOf(
[ 2, 3, 5 ],
[ 2, 3, 5, 7, 11 ]
));
// => true

Für Objekte funktioniert der Aufruf gleichermaßen, wobei hier für den Vergleich auf die Key-Value-Paare zurückgegriffen wird:

console.log(isSubsetOf(
{ name: 'the native web' },
{ name: 'the native web', city: 'Riegel am Kaiserstuhl' }
));
// => true

Das Modul unterstützt auch verschachtelte Arrays und Objekte, sodass damit auch komplexe Strukturen verglichen werden können. Für innere Arrays und Objekte wird die Teilmengeneigenschaft dann rekursiv ermittelt, wobei auch ein Schutz vor endloser Rekursion integriert ist – der dann relevant ist, wenn sich Arrays oder Objekte als Referenz selbst enthalten.

Da das Modul den Vergleich mit der Semantik kleiner oder gleich anstellt, lässt es sich theoretisch auch dazu nutzen, die Gleichheit zweier Arrays oder Objekte sicherzustellen, wobei hier ausdrücklich der Vergleich auf Werte- und nicht auf Referenzbasis gemeint ist. Gleichheit gilt nämlich genau dann, wenn beide Arrays oder Objekte jeweils eine Teilmenge der Gegenseite sind:

const areEqual = function (left, right) {
return (
isSubsetOf(left, right) &&
isSubsetOf(right, left)
);
};

Zu guter Letzt kann das Modul mit der Funktion isSubsetOf.structural auch prüfen, ob ein Objekt eine Teilmenge eines anderen ist im Hinblick auf die Keys, also unabhängig von den jeweiligen Werten. Das ermöglicht beispielsweise die Prüfung, ob ein Objekt einer vorgegebenen Struktur entspricht.

Wie das Modul entstanden ist, zeige ich in der 25. Folge meiner Einführung in Node.js.

Einführung in Node.js, Folge 25: Let's code (is-subset-of)

tl;dr: Das npm-Modul is-subset-of implementiert eine Funktion, mit deren Hilfe sich ermitteln lässt, ob ein Array in einem anderen Array beziehungsweise ein Objekt in einem anderen Objekt enthalten ist. Die 25. Folge der Einführung in Node.js zeigt, wie das Modul entstanden ist.