Groups | Search | Server Info | Keyboard shortcuts | Login | Register
Groups > de.comp.lang.javascript > #5200
| 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> |
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 | Next — Previous in thread | Next in thread | Find similar
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