ugrás a tartalomhoz

JS: for..in megszakítása majd folytatása

Anonymous · 2006. Szep. 12. (K), 19.04
Sziasztok!

Szeretnék megszakítással végigsétálni egy objektum elemein, pl:
for (i in obj)
if (i==valami) break;

...

Itt folytatnám, esetleg később settimeouttal, vagy ilyesmi. Nem akarom elölröl kezdeni a ciklust, az felesleges.
Lehet valahogy folytatni? ... gondolom nem, mert sehol sem találtam ilyesmit. De van-e valami trükk?
Pl arra gondoltam, hogy megkettőzöm az objektumot, és amin végigmentem, azt kiveszem belőle, így legközelebb már csak a maradék marad (logikus :-)
De nem tudom hatékonyan megkettőzni, sőt kivenni belőle sem megy. pl. obj['ize']=null még nem elég, ettől még az 'ize' tulajdonság megmarad...

Van valakinek valami jó ötlete?
Köszönöm!
Wezz
 
1

Egy megoldás

sly · 2006. Szep. 12. (K), 19.40
Nem elenöriztem, de szerintem ez egy jó megoldás lehet:
function ciklus() 
{
var mem;
for (i in obj) {
  if (i==valami) {
    mem = i;
    document.write("megy");
    break;
  }
}
}

function ciklusfojt() 
{
for (i in obj) {
  if (i==mem) {
    mem = i;
    document.write("tovább megy");
  }
}
}
2

amire gondolsz az a delete

toxin · 2006. Szep. 12. (K), 19.46

function foo(var1,var2){
    this.var1 = var1;
    this.var2 = var2;
}

var objFoo = new foo('foo1','foo2')
for (var i in objFoo)
{
    alert (i);
    break;
}

delete (objFoo.var1);

for (var i in objFoo)
{
    alert (i);
    break;
}
bővebben http://htmlinfo.polyhistor.hu/js13guide/expr.htm#1008702

üdv t :)
3

Objektummásolás?

Anonymous · 2006. Szep. 12. (K), 20.39
Ó, köszönöm a gyors válaszokat!
Sly: a kódodat nemigazán értettem, de gondolom azt sugalltad, hogy az aktuális ciklusváltozót mentsem el, és aztán próbáljam meg ráerőszakolni a 2. ciklusra, ugye? Ez nagyon nagy ötlet! Kipróbáltam így (alább) de sajnos nem működik.


<html>
 <head>
  <title>teszt</title>

<script type="text/javascript">

a={};
a['a']=1;
a['b']=2;
a['c']=3;
a['d']=4;
a['e']=5;
a['f']=6;
a['g']=7;

s="";
for (i in a) s+=i+",";

document.write(s+"<br><br>");

valami="e";

function ciklus(obj)
{

for (i in obj) {
  document.write(i+"<br>");
  if (i==valami) {
    mem = i;
    document.write("szakad itt:"+i+"<br>");
    break;
  }
}
}

function ciklusfolyt(obj)
{
var kezd=0;
for (i in obj) {
  if (!kezd) {
    i=kezd=mem;
    document.write("tovább megy:<br>");
    //continue;
  }
  document.write(i+"<br>");
}
}

ciklus(a);
ciklusfolyt(a);

b=a.valueOf();
delete(b['b']);
z="";
for (i in b) z+=i+",";
document.write("<br>"+z+"<br>");

s="";
for (i in a) s+=i+",";
document.write("<br>"+s+"<br>");
document.write("valueof a:"+a.toString()+"<br>");
</script>

 </head>
 <body>

</body>
</html>

Szomorú, de mindegy mit adok meg "valami"-nek, a 2. ciklus csak az 1. elemet hagyja ki (vagyis azt sem) ergó van egy belső ciklusváltozó, ami fütyül az i-re... Kár.

Toxin:
Köszi a delete-t, most hogy írtad, nekem is beugrott :-)
... objektummásolásra nincs valami egyszerűbb, gyorsabb mód, mint végigmenni rajta és elemenként lemásolni? (próbálkoztam a valueOffal, de nem nyert)

Köszi
Wezz
4

re

toxin · 2006. Szep. 12. (K), 22.40
mélem jó, meg nem egy nagy megoldás de a pizsama leárnyékolja az agyam ill. három pislantásból egyszer látom a monitort :))) , majd holnap ránézek megint :)

a=[];
a['a']=1;
a['b']=2;
a['c']=3;
a['d']=4;
a['e']=5;
a['f']=6;
a['g']=7;

s="";
for (i in a) s+=i+",";

document.write(s+"<br><br>");

var valami="c";
var mem ="";

function ciklus(obj)
{

    for (var i in obj)
    {
        document.write(i+"<br>");
        if (i!=valami) continue;

        mem = i;
        document.write("szakad itt:"+i+"<br>");
        break;
    }
    delete this.i;
}


function ciklusfolyt(obj)
{
    var cont = false;
    for (var i in obj)
    {
       if (cont) mem = i;
       if (i!=mem ) continue;
       
       cont = true 
       document.write(i+"<br>");

    }
}


ciklus(a);
ciklusfolyt(a);
5

Ez azért mégiscsak végigfut még egyszer...

Anonymous · 2006. Szep. 12. (K), 23.11
Köszi, igazán nem akartam hogy kódot adj, (főleg nem, hogy elrontsad a szemed :-), csak gondoltam, hátha van valakinek ötlete...
Szóval ha jól látom, ebben a verzióban végigtekered a 2. ciklust a mem-ig, vagyis ismét végigfut az egészen (bár gyorsan) ... szóval közben az az ötletem támadt, hogy az objektumnak csinálok 2 tempobjektumát; amikor feltöltöm az objektumot adatokkal, feltöltöm a másikat is (nem nagy időkiesés) (a 2.temp üres) -- majd amikor az első ciklus elkezd végigmenni, akkor a temp[1] objektumon megy végig, kitörölgeti az elemeket, és a feldolgozott elemeket átpakolja közben a temp[2]-be; ez akárhány ütemben elvégezhető. Ha elfogytak az elemek, legközelebb a temp[2] objektumon megyek végig és a temp[1]be rakom át a cuccot. Jó ötlet, nem?
Köszi a hozzászólásokat, heppi kódolást!
Wezz
6

egy némiképp átgondoltabb

toxin · 2006. Szep. 13. (Sze), 08.17
variáns, immár némi aggyal+kv :)

function myObj(){
    this['a']=1;
    this['b']=2;
    this['c']=3;
    this['d']=4;
    this['e']=5;
    this['f']=6;
    this['g']=7;
}
var testObj = new myObj();


s="";
for (i in testObj) s+=i+",";

document.write(s+"<br><br>");

function ciklus(obj)
{

    for (var i in obj)
    {
        if(typeof(obj[i]) != 'undefined' && i!=breaker)
        {
            document.write(i+"<br>");
            obj[i] = undefined;
        }
        else if (i==breaker)
        {
            document.write("szakad itt:"+i+"<br>");
            break;
        }
    }

}

var breaker = 'c';
ciklus(testObj);

var breaker = 'e';
ciklus(testObj);

var breaker = undefined;
ciklus(testObj);
még mindig csak ötletszintű a dolog, az objektum az objektumban stb. megszakításos vardump-ot rekurzióval már rádhagyom :) de csak mert dóógozni kell :))) egyébként kihívás szóval majd gondolkozok azon is


üdv t
7

és mindez prototype class-ban

toxin · 2006. Szep. 13. (Sze), 10.41

var myDump = 

    Class.create();
    myDump.prototype = {
        
        initialize : function(obj){
            this.obj = obj;
            this.innerPointer = $H(this.obj).keys().first();
            this.pointer = undefined;
        },
        
        dumpTo : function (pointer){
            this.pointer = pointer;
            this.innerPointerCheck = true;
            this.go = false;
            
            var dumpArray  = $H(this.obj).partition(
                function(elem,index){
                   this.go = (this.go)? true : elem.key == this.pointer; 
                   this.innerPointerCheck = (!this.innerPointerCheck)? false : this.innerPointer != elem.key;
                   return this.go || this.innerPointerCheck ;
                }.bind(this)
             );
             this.innerPointer = this.pointer;
             
              $A(dumpArray[1]).each(
                function(elem){
                    document.write(elem[0]+':'+this.obj[elem[0]]+"<br>");
                }.bind(this)
             )
             document.write("<br>");
             
        },
        
        setFrom : function(pointer){
            this.innerPointer = pointer;
        } 
}


function myObj(){
    this['a']=1;
    this['b']=2;
    this['c']=3;
    this['d']=4;
    this['e']=5;
    this['f']=6;
    this['g']=7;
}
var testObj = new myObj();

myDumper = new myDump(testObj);
myDumper.dumpTo('c');
myDumper.dumpTo('f');


myDumper.setFrom('c');
myDumper.dumpTo('');

http://toxin.hu/weblabor/varDump/varDump.html


dumpTo metódussal kiiírja addig (és tárolja egy belős mutatóban az -iget), setFrom peddig állítja a belső mutatót és kiiírja legközelebb onnantól dumpTo-ig, eredeti objektum megörződik természetesen

no áldassék a maximalizmus és az intelligancia minden formája :)

üdv t

ui:
partition([iterator]) példány iterator: egy függvény objektum Function(value, index) formában Egy tömbböt fog visszaadni amely másik két tömbböt tartalmaz. Az első az összes olyan elemet tartalmazza, melyen az iterátorhívás true eredményt produkált, a másikban pedig a többi elem lesz. Ha az iterator nem volt megadva, akkor az első tömbben azon elemek lesznek, melyek true értéket produkálnak, a másikban pedig értelemszerűen a többi elem lesz.

http://prototype.rajmi.hu/prototype.js.hu.html
8

Toxin egy vonat

Anonymous · 2006. Szep. 13. (Sze), 18.08
Toxin köszi, olyan vagy, mint egy megállíthatatlan vonat, egyre gyorsulva előretörsz a cél felé... (birom az ilyen hozzáállást, sokszor én is így nyomom :-)
... a prototype-ot nem használom (még) ezért ez utóbbit kissé nehezen értelmezem (meg felmérni sem tudom, hogy mennyire hatékony) --- remélem, nem csak miattam csináltad (már csak azért is, mert említettem, hogy nem kódot kérek) -- meg természetesen már én is megcsináltam a 2 temptömbös változatot időközben (ide be is illeszteném, de nem általános kód, hanem feladatspecifikus -- majd később írok egy absztrakt verziót is talán)

Szóval hajrá Toxin!

Wezz