Mich persönlich würde jetzt noch triggern, dass die beiden Funktionen sich lediglich darin unterscheiden, ob sie mit
some
oderevery
suchen, und ich würde das vermutlich noch abstrahieren. Und in ein Objekt kapseln. Das wird dann aber schwerer verständlich. Aussehen täte es so:
Deine Grundidee mit some
und every
zu arbeiten gefällt mir besser als meine erste Eingebung mit der Schnittmenge. Ich glaube deinen Ansatz kann man noch noch stark vereinfachen. Ich würde bspw. auf die Überladung verzichten und den dynamischen Array-Test rausnehmen. Dadruch verliert man nichts, weil man die Funktion ja immernoch mit f([arg1, arg2,])
anstatt f(arg1, arg2)
aufrufen kann. Außerdem würde ich nicht über den Quantor abstrahieren, sondern einen Abschluss (Closure) über das gemeinsame Prädikat bilden. Dann bleibt folgendes ürbig:
function all(genresToFind) {
return movie => genresToFind.every(isIncludedIn(movie.genres))
}
function some(genresToFind) {
return movie => genresToFind.some(isIncludedIn(movie.genres))
}
function isIncludedIn (movieGenres) {
return genre => movieGenres.includes(genre)
}