Rolf b: replace_nth() auch mit negativer Positionsangabe

Beitrag lesen

Meine bisherige Erfahrung mit APIs ist eigentlich auch die, dass für die jeweiligen Parameter der passende Datentyp erwartet wird. Von einer Toolbox-Funktion wie replace_nth zu erwarten, dass sie ihre Parameter auf passende Typen normiert, verletzt eigentlich die Idee der Separation of Concerns.

Abgesehen läufst Du ohne parseInt auch bei positiven Werten für occur Gefahr, dass es Fehler gibt, z.B. ergibt 3 + "1" nicht 4, sondern "31".

Ich finde übrigens deinen for-Body ziemlich umständlich; besser ist, wenn man alles, was nicht unbedingt in die Schleife hinein muss, herauszieht; und bei symmetrischem Code versucht man auch, die Symmetrie durch Umrechnen von Parametern auszunutzen. Und den Sonderfall occur=0 kann man eleganter lösen.

Meine Version von replace_nth sieht so aus (ohne Parameterprüfungen):

function replace_nth(input, search, replace, occur)
{
   var items = input.split(search);

   if (occur == 0)                    // occur=0 bedeutet replace all
      return items.join(replace);
   if (occur < 0)                     // negatives occur auf positive Sicht umrechnen
      occur = items.length + occur;

   occur--;                           // occur auf 0-basiert umrechnen
   var lastItem = items.pop();
   var result = '';
   for(n = 0; n < items.length; n++)
   {
      result += items[n] + (n == occur ? replace : search);
   }
   return result + lastItem;
}

Eine Alternative zur Stringverkettung könnte das hier sein:

   for(n = 0; n < items.length; n++)
   {
      items[n] = items[n] + (n == occur ? replace : search);
   }
   return items.join('') + lastItem;

Oder noch heftiger mit Funktionen der JS Library:

   return items.map(function(item, i) {
                       return item + (i == occur ? replace : search);
                    })
               .join('') + lastItem;

JavaScript ist wie APL - es erlaubt einzeilige Programme beliebiger Komplexität 😂

Allerdings muss man das erstmal auf Laufzeit messen, es könnte unterm Strich langsamer sein als einfache Stringverkettung. Die Javascript-Engines der Browser sollen hier große Unterschiede haben.

Rolf