Groups | Search | Server Info | Keyboard shortcuts | Login | Register


Groups > de.comp.lang.javascript > #5200

Re: Semikolons aus Daten entfernen

From Thomas 'PointedEars' Lahn <PointedEars@web.de>
Newsgroups de.comp.lang.javascript
Subject Re: Semikolons aus Daten entfernen
Date 2019-11-19 00:03 +0100
Organization PointedEars Software (PES)
Message-ID <1875849.oMNUckLgyt@PointedEars.de> (permalink)
References (11 earlier) <qqm3fe$vp5$1@news.albasani.net> <2504059.mvXUDI8C0e@PointedEars.de> <4409b8edd1851935327e6bfc548ad86ce4469530.camel@gmx.net> <4187812.LvFx2qVVIh@PointedEars.de> <e4576dd61b4c32db07e2b4dc869660eb6c74d365.camel@gmx.net>

Show all headers | View raw


Stefan Mayer wrote:

> Array.prototype.Wert4 = "Außerhalb von 'werte' definiert.";
> 
> const werte = [
>     'Wert1',
>     'Wert2',
>     'Wert3'
> ];
> console.log(werte);
> // [ 'Wert1', 'Wert2', 'Wert3' ]
> 
> for (let i in werte) {
>     console.log(`${i}: ${werte[i]}`)
> }
> // 0: Wert1
> // 1: Wert2
> // 2: Wert3
> // Wert4: Außerhalb von 'werte' definiert. < Bingo: Unerwartet.
> ```
> 
> Deshalb die Prüfung "hasOwnProperty" in "for in" Schleifen. Oder eben
> gleich "forEach"

Genau.
 
> 
> ```
> werte.forEach((wert, i) => {
>     console.log(`${i}: ${wert}`)
> })
> 
> // 0: Wert1
> // 1: Wert2
> // 2: Wert3
> ```
> 
> Puh, da bin ich ja froh, dass ich "forEach" schon immer hübscher fand.

Das gab es aber nicht immer (wurde mit ECMAScript Edition 5 vor ca. 9 Jahren 
eingeführt).  Aber letztlich ist Array.prototype.forEach() auch nichts 
anderes als eine for-Schleife mit Callback.  Kann man leicht selbst 
implementieren (hab’ ich auch für meine ECMAScript-Referenzimplementierung), 
z. B. (wahrscheinlich unvollständig, siehe Spezifikation):

  Array.prototype.forEach = function (callback, thisValue) {
    if (!thisValue) thisValue = this;

    var _hasOwnProperty = ({}).hasOwnProperty;

    for (var i = 0, len = this.length; i < len; ++i)
    {
      if (_hasOwnProperty.call(this, i))
      {
        callback.call(thisValue, this[i], i, this);
      }
    }
  };

foreach() bzw. diese for-Schleife hat aber den Nachteil, dass sie sehr 
ineffizient bei “sparse arrays” ist, d. h. wo eine signifikante Anzahl 
Array-Elemente nicht definiert sind:

  let a = [];
  a[Math.pow(2, 31)] = 42;

Das iteriert dann sehr lange, führt aber z. B. den Callback nur einmal aus.  
Hingegen ist die Iteration mit

  var _hasOwnProperty = ({}).hasOwnProperty;

  /* bzw. “for (let name in a)“
  for (var name in a)
  {
    if (parseInt(name, 10) == +name
        || !_hasOwnProperty.call(a, name))
    {
      continue;
    }

    /* … */
  }

vergleichsweise schnell (ich habe auch absichtlich die Logik umgekehrt, um 
durch schnelle Auswertung die Effizienz noch einmal zu steigern.  Leider 
gibt es keinen direkten Weg, herauszufinden, ob eine Array-artige 
Datenstruktur “sparse” ist; jedoch kann .length einen Hinweis geben (ist es 
sehr gross, dann ist die Wahrscheinlichkeit höher, dass die Struktur 
“sparse” ist.

Ausserdem könnte man einmalig in einer kleinen Anzahl Schritte pseudo-
zufällig über die Struktur mit bis maximal .length - 1 iterieren und zählen, 
wie oft man dabei (mit in-Operator und Object.prototype.hasOwnProperty(), 
oder Array.prototype.contains() über die Keys) ins Leere griff.  Wird dabei 
ein kritischer Wert überschritten, kann man annehmen, dass die Struktur 
“sparse” ist und mit for-in statt for(each)-Iteration arbeiten.
 
> Wenn man allerdings mit dem Index hantiert, ist "Wert4" nicht da, weil
> nicht explizit in "werte" vorhanden. Richtig?

Nein.  Zwar ist die Eigenschaft mit Name „Wert4“ tatsächlich keine des 
Array-artigen Objekts selbst; aber das spielt keine Rolle, weil Du bei der 
Iteration gar nicht mehr auf diese Eigenschaft zuzugreifen versuchst.
 
> ```
> for (let i = 0; i < werte.length; i++) {

Effizienter:

  for (let i = 0, werte.length; i < len; ++i)
  {

Wenn es auf die Reihenfolge nicht ankommt,

  for (let i = werte.length; i--)
  {

wobei man mit dem i-- wieder einen Teil der Effizienz einbüsst.

-- 
PointedEars
FAQ: <http://PointedEars.de/faq> | <http://PointedEars.de/es-matrix>
<https://github.com/PointedEars> | <http://PointedEars.de/wsvn/>
Twitter: @PointedEars2 | Please do not cc me./Bitte keine Kopien per E-Mail.

Back to de.comp.lang.javascript | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

Semikolons aus Daten entfernen Wolfgang Wolf <w.wolf@dommel.de> - 2019-09-26 11:44 +0200
  Re: Semikolons aus Daten entfernen Wolfgang Wolf <w.wolf@dommel.de> - 2019-09-26 13:40 +0200
    Re: Semikolons aus Daten entfernen Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2019-09-26 18:00 +0200
      Re: Semikolons aus Daten entfernen Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2019-09-26 18:09 +0200
      Re: Semikolons aus Daten entfernen Wolfgang Wolf <w.wolf@dommel.de> - 2019-09-28 10:22 +0200
        Re: Semikolons aus Daten entfernen Stefan Mayer <meniskus@gmx.net> - 2019-09-28 14:25 +0200
          Re: Semikolons aus Daten entfernen Wolfgang Wolf <w.wolf@dommel.de> - 2019-10-07 15:59 +0200
            Re: Semikolons aus Daten entfernen Stefan Mayer <meniskus@gmx.net> - 2019-10-08 00:42 +0200
        Re: Semikolons aus Daten entfernen Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2019-09-28 17:41 +0200
          Re: Semikolons aus Daten entfernen Wolfgang Wolf <w.wolf@dommel.de> - 2019-10-07 16:06 +0200
            Re: Semikolons aus Daten entfernen Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2019-10-10 01:26 +0200
              Re: Semikolons aus Daten entfernen Wolfgang Wolf <w.wolf@dommel.de> - 2019-11-12 16:58 +0100
                Re: Semikolons aus Daten entfernen Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2019-11-13 01:04 +0100
                Re: Semikolons aus Daten entfernen Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2019-11-14 19:27 +0100
                Re: Semikolons aus Daten entfernen Wolfgang Wolf <w.wolf@dommel.de> - 2019-11-15 12:51 +0100
                Re: Semikolons aus Daten entfernen Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2019-11-16 04:22 +0100
                Re: Semikolons aus Daten entfernen Stefan Mayer <meniskus@gmx.net> - 2019-11-16 13:42 +0100
                Re: Semikolons aus Daten entfernen Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2019-11-16 14:51 +0100
                Re: Semikolons aus Daten entfernen Stefan Mayer <meniskus@gmx.net> - 2019-11-18 11:56 +0100
                Re: Semikolons aus Daten entfernen Wolfgang Wolf <w.wolf@dommel.de> - 2019-11-18 13:50 +0100
                Re: Semikolons aus Daten entfernen Stefan Mayer <meniskus@gmx.net> - 2019-11-18 15:43 +0100
                Re: Semikolons aus Daten entfernen Wolfgang Wolf <w.wolf@dommel.de> - 2019-11-18 16:40 +0100
                Re: Semikolons aus Daten entfernen Stefan Mayer <meniskus@gmx.net> - 2019-11-18 21:32 +0100
                Re: Semikolons aus Daten entfernen Wolfgang Wolf <w.wolf@dommel.de> - 2019-11-19 07:49 +0100
                Re: Semikolons aus Daten entfernen Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2019-11-19 00:03 +0100
                Re: Semikolons aus Daten entfernen Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2019-11-19 18:48 +0100
                Re: Semikolons aus Daten entfernen Stefan Mayer <meniskus@gmx.net> - 2019-11-19 19:42 +0100
                Re: Semikolons aus Daten entfernen Stefan Mayer <meniskus@gmx.net> - 2019-11-20 20:31 +0100
                Re: Semikolons aus Daten entfernen Wolfgang Wolf <w.wolf@dommel.de> - 2019-11-16 13:45 +0100
                Re: Semikolons aus Daten entfernen Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2019-11-16 14:57 +0100
                Re: Semikolons aus Daten entfernen Wolfgang Wolf <w.wolf@dommel.de> - 2019-11-18 10:08 +0100
                Re: Semikolons aus Daten entfernen Wolfgang Wolf <w.wolf@dommel.de> - 2019-11-14 11:48 +0100
  Re: Semikolons aus Daten entfernen Claus Reibenstein <4spamersonly@kabelmail.de> - 2019-09-26 14:44 +0200
    Re: Semikolons aus Daten entfernen Wolfgang Wolf <w.wolf@dommel.de> - 2019-09-26 15:57 +0200

csiph-web