Hallo,
Als globale Funktion ist das nur Handwerk
while ( iterOwn(obj,key) ) { BLOCK }Eigenschaften kann man mit for-in durchlaufen, aber eine for-in-Schleife nicht nach einem Durchlauf abbrechen, um beim nächsten Durchlauf an dieser Stelle weiterzumachen. Das kann man natürlich, wenn man irgendwo die letzte Property speichert, nur wo will man sie sinnvollerweise speichern? Außerdem, wie setzt die iter-Funktion die lokale Variable? Es ginge höchstens while (wert = iter(obj)) oder so etwas.
Wie gesagt, die Laufvariable ist Träger der Info, muss dafür aber vorweg als Objekt initialisiert werden.
Das wird vielleicht an etwas Code klarer:
<html><body>
<h3> nextOwn v0.2 </h3>
<pre>
<script>
//~~~javascript
function echo(str) {
document.writeln(str);
}
function keys (obj) {
a=new Array();
for (key in obj)
if(obj.hasOwnProperty(key)) {
a.push(key);
};
return a;
}
function nextOwn( obj,key) {
if (! key.hash || key.hash != obj ) {
/* init /
key.hash=obj;
key.array=keys(obj);
key.toString=function () {
return this.array[this.idx]
}
key.key="";
key.value="";
key.idx=0;
} else {
/ next */
key.idx++;
}
with (key) {
if ( idx<array.length ) {
key=array[idx];
value=hash[key];
return true;
}
else {
delete hash ;
return false;
}
}
}
/*
* Test
*/
var hash={a:"A",b:"B",c:"C",d:"D"};
var hash2={c:"C",d:"D"};
var j={}; // Laufvariable initialisieren
while( nextOwn( hash, j ) ){
echo( j +":"+hash[j] );
echo( j.idx+" > "+j.key +":"+ j.value +" ["+j.array+"]");
};
echo("<hr>")
while( nextOwn( hash, j ) ){
echo( j +":"+hash[j] );
echo( j.idx+" > "+j.key +":"+ j.value +" ["+j.array+"]");
};
echo("<hr>")
while( nextOwn(hash2, j) ){
echo( j +":"+hash[j] );
echo( j.idx+" > "+j.key +":"+ j.value +" ["+j.array+"]");
};
//
</script>
</pre>
</body></html>
Zufrieden bin ich nicht, aber bevor sich die Diskussion länger hinzieht mal diese Approximation. Ein key={} vorm while ist IMHO immernoch die eleganteste der bisherigen Lösungen.
Eine Alternative wäre, wie auch bereits gesagt, bei jeder Schleife einen eindeutiges "Label" als String zu übergeben. (analog zu den break/continue Labels) um die Schleife eindeutig auszuzeichnen.
while ( key=nextOwn(hash,"label") ) {}
Aber dann erscheint mir die erste Lösung mit key={} vorweg noch angenehmer!
> > Gegenfrage weiter unten sprichst du glaube ich davon den Object Konstruktor zu verändern, könntest du das für uns präzisieren?
>
> function Object () {}
Ja klar, so weit waren wir auch schon, aber welchen Vorteil es bringt, um .begetObject zu realisieren hast du nicht erklärt. Ich sehe keinen.
So long
LanX