Rolf B: String in Array konvertieren

Beitrag lesen

Hallo heinetz,

sehe ich es richtig, dass Du eine Funktion hast, die als Eingabe entweder einen Wert oder ein Array aus Werten bekommt, und Du einen einzelnen Wert wie ein Array mit einem Wert darin verarbeiten willst? Ich sage bewusst nicht String - denn wenn Du das voraussetzt müsstest Du das ja eigentlich auch prüfen...

Nützlich wäre eigentlich eine Aufteilung in 2 Funktionen. Die eine kümmert sich um die Schnittstelle, die andere um die Aufgabe (das „do something“). Also grundsätzlich so:

function doSomething(value) {
   if (Array.isArray(value)) {
      value.forEach(v => reallyDoSomething(v));
// oder
      for (var i=0; i<value.length; i++)
         reallyDoSomething(value[i]);
   }
   else
      reallyDoSomething(value);
}

Das kann man sogar auf "forEach-fähige" Dinge verallgemeinern:

function doSomething(value) {
   if (value && value.forEach) {
      value.forEach(v => reallyDoSomething(v));
   }
   else
      reallyDoSomething(value);
}

Die reallyDoSomething-Funktion erledigt dann die eigentliche Aufgabe.

Das wird blöd, wenn die reallyDoSomething-Funktion eine Form von Kontext braucht, mit dem sie ihre Aufgabe erledigen soll. Wenn Du eine Minimumsuche baust, muss reallyDoSomething den bisher gefundenen minimalen Wert speichern. Wenn die Strings / der String irgendwo hin geschrieben werden sollen, braucht reallyDoSomething das Ziel des Schreibvorgangs.

Das blödeste ist, dass Du hier eigentlich einen forEach-/single-value Adapter gebaut hast und sowas eigentlich ein schickes Tool ist. Warum also diesen Adapter nicht klar als solchen nutzen und die reallyDoSomething-Funktion einfach als Parameter hineinschieben? Dann bringt sie als Closure auch gleich ihren Aufrufkontext mit, was nützlich für den besagten Kontext sein kann.

function callForValues(value, action) {
   if (value && value.forEach) {
      value.forEach((v,i) => action(v, i));
   }
   else
      action(value, 0);
}

Die action bekommt zwei Parameter: den Wert und den Index des Wertes. Verwendung:

  callForValues( [ "foo", "bar", "baz" ], logValues);
  callForValues( "hugo", logValues);

  function logValues(val, pos) {
     console.log("Wert " + pos + " ist " + (val == null ? "<null>" : val));
  }

logValues gibt genau einen Wert zusammen mit seiner Position aus, und callForValues kümmert sich um den Unterschied "ein Wert" vs "forEach-fähige Sammlung von Werten".

Natürlich bist Du aufgeschmissen, wenn dein "Wert" ein Array ist, d.h. du entweder ein Array oder ein Array aus Arrays als Input bekommst. Dann musst Du eine spezialisierte Prüfung programmieren. Das Trennen der Logik in "Einzelverarbeitung vs Mengenverabeitung" und "Verarbeite einen einzelnen Wert" ist aber auch da hilfreich.

HTH
Rolf

--
sumpsi - posui - clusi