Hallo ebody,
wieder was gelernt. Object.entries kannte ich nicht 😂
Letztlich erzeugst Du auf diesem Weg aus searchKeyValuePair und inThisObject kompatible Strukturen, nämlich ein Array von Arrays mit zwei Einträgen, in denen jeweils Eigenschaftsname und Wert stehen.
Bei arrSearchKeyValuePair bist Du aber über das Ergebnis im Irrtum, denn Object.entries erzeugt ein Array aus Arraypärchen, ein Pärchen pro Objekteigenschaft, und deshalb sieht arrSearchKeyValuePair so aus:
[
[['Title', 'Batman']],
[['Genre', 'Science-Fiction']],
[['Title', 'Prometheus']],
...
]
Du sieht das zusätzliche Klammerpaar? Das willst Du nicht. Du müsstest aus dem map Callback das Ergebnis Object.entries(searchItem)[0]
zurückgeben. Dann käme das raus, was Du Dir gedacht hast.
Aber dann kommst Du mit some, und some braucht eine Callback-Funktion. Du übergibst aber eins von diesen Arrays mit zwei Einträgen. D.h. das zentrale Problem, wie Du in einem Objekt eine Eigenschaft findest, deren Name Du erst zur Laufzeit kennst, hast Du nicht gelöst.
Mein Fazit: Deine Transformierung mit Object.entries macht Dir die Aufgabe nicht leichter, eher schwerer.
Für eine Lösung wäre aber auch noch die Frage interessant: wie sieht es mit case-sensitivity aus? Wenn Du im searchKeyValuePair den Eintrag { title: 'Batman' } hast, soll dieser Eintrag die Eigenschaft Title
in inThisObject abfragen? Also kleines title vs großes Title? Nehmen wir erstmal an, dass Du dafür keinen Treffer willst.
Ob Du dann .filter auf searchKeyValuePairs oder arrSearchKeyValuePairs anwendest, ist ziemlich egal. Ich würde hier noch die Frage stellen, ob searchKeyValuePairs tatsächlich so aussehen muss, wie es aussieht. Ein keyValuePair sollte so aussehen:
{ key: 'Title', value: 'Batman' }
,
denn dann
- ist sichergestellt, dass es auch ein PAAR ist
- musst Du nicht den Namen des Schlüssels aus dem Objekt herausfummeln
Wenn Du deine searchKeyValuePairs so aufbaust, kannst Du auf Object.entries ganz verzichten. Statt dessen rufst Du filter direkt auf searchKeyValuePairs auf, schaust mit der hasOwnProperty Methode nach, ob inThisObject eine Eigenschaft mit dem Namen hat, der in searchItem.key steht und vergleichst dann die Werte. Das ist ein Einzeiler.
Statt hasOwnProperty könnte man auch den in Operator verwenden (Huch, der fehlt im Selfwiki?!), aber in
liefert auch für geerbte Eigenschaften UND Methoden true - das kann nach hinten losgehen.
Links:
Rolf
sumpsi - posui - obstruxi