Rolf B: key:value in Objekt finden

Beitrag lesen

problematische Seite

Hallo ebody,

Wäre so auch möglich { key: 'Title', value: 'Batman' }. Gut zu wissen, dass man Objekte auch so schreiben kann.

Das hast Du gewusst. Das ist nichts anders als { Title: 'Batman'}, nur mit zwei Eigenschaften statt einer. Der Vorteil ist aber, dass Du bei meinem Vorschlag die Eigenschaftsnamen kennst und nicht erst heraussuchen musst. Deine Schreibweise kann dann interessant werden, wenn deine SearchItems nach mehr als einer Eigenschaft gleichzeitig suchen sollen.

....filter(search => 
  /** Enthält inThisObject den Key von search (z.B. {Title: 'Batman'})? */
  inThisObject.hasOwnProperty(Object.keys(search).toString()) 
  /** Enthält der Wert von search (z.B. {Title: 'Batman'}) den gleichen Wert wie inThisObject['mit dem aktuellen Key']? */
  && Object.values(search).includes(inThisObject[Object.keys(search).toString()]))

Weia. Mit search.key statt Object.keys(search).toString() wäre das deutlich lesbarer. Aber wenn Du unbedingt bei deiner Form der Searchitems bleiben willst, dann mach es so:

....filter(search => {
  /** Zu findendes Property ist einziger Key in search (z.B. {Title: 'Batman'}) */
  const key = Object.keys(search)[0];
  /** Enthält inThisObject den Key ? */
  /** und stimmt search[key] mit dem Wert von inThisObject[key] überein? */
  return inThisObject.hasOwnProperty(key) && search[key] == inThisObject[key])
       
})

Man muss jetzt geschweifte Klammern um den Body der Pfeilfunktion setzen und das return-Statement hinschreiben, weil eine lokale Variable deklariert wird. Das kann man vermeiden, indem man die lokale Variable als Parameter tarnt:

....filter((search, key) => 
  /** Zu findendes Property ist einziger Key in search (z.B. {Title: 'Batman'}) */
  inThisObject.hasOwnProperty(key = Object.keys(search)[0]) 
  /** Stimmt search[key] mit dem Wert von inThisObject[key] überein? */
  && inThisObject[key] == search[key])
)

aber das ist ein Beispiel für üblen und kaum verständlichen Code und nicht zu empfehlen. Ein Minifizierer darf sowas vielleicht produzieren, aber lesbarer Code ist das nicht.

Was spricht dagegen?

  • Der filter-Callback hat laut Spec 3 Parameter: Wert, Index und Array. Die muss man nicht alle übernehmen, aber wenn man einen davon deklariert und ihn dann für einen ganz anderen Zweck verwendet, ist das unfallträchtig.
  • Der Missbrauch von key ist darüber hinaus noch als Seiteneffekt in der Parameterübergabe an hasOwnProperty versteckt.

Rolf

--
sumpsi - posui - obstruxi