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:
  1. function ciklus()   
  2. {  
  3. var mem;  
  4. for (i in obj) {  
  5.   if (i==valami) {  
  6.     mem = i;  
  7.     document.write("megy");  
  8.     break;  
  9.   }  
  10. }  
  11. }  
  12.   
  13. function ciklusfojt()   
  14. {  
  15. for (i in obj) {  
  16.   if (i==mem) {  
  17.     mem = i;  
  18.     document.write("tovább megy");  
  19.   }  
  20. }  
  21. }  
2

amire gondolsz az a delete

toxin · 2006. Szep. 12. (K), 19.46
  1. function foo(var1,var2){  
  2.     this.var1 = var1;  
  3.     this.var2 = var2;  
  4. }  
  5.   
  6. var objFoo = new foo('foo1','foo2')  
  7. for (var i in objFoo)  
  8. {  
  9.     alert (i);  
  10.     break;  
  11. }  
  12.   
  13. delete (objFoo.var1);  
  14.   
  15. for (var i in objFoo)  
  16. {  
  17.     alert (i);  
  18.     break;  
  19. }  
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.
  1. <html>  
  2.  <head>  
  3.   <title>teszt</title>  
  4.   
  5. <script type="text/javascript">  
  6.   
  7. a={};  
  8. a['a']=1;  
  9. a['b']=2;  
  10. a['c']=3;  
  11. a['d']=4;  
  12. a['e']=5;  
  13. a['f']=6;  
  14. a['g']=7;  
  15.   
  16. s="";  
  17. for (i in a) s+=i+",";  
  18.   
  19. document.write(s+"<br><br>");  
  20.   
  21. valami="e";  
  22.   
  23. function ciklus(obj)  
  24. {  
  25.   
  26. for (i in obj) {  
  27.   document.write(i+"<br>");  
  28.   if (i==valami) {  
  29.     mem = i;  
  30.     document.write("szakad itt:"+i+"<br>");  
  31.     break;  
  32.   }  
  33. }  
  34. }  
  35.   
  36. function ciklusfolyt(obj)  
  37. {  
  38. var kezd=0;  
  39. for (i in obj) {  
  40.   if (!kezd) {  
  41.     i=kezd=mem;  
  42.     document.write("tovább megy:<br>");  
  43.     //continue;  
  44.   }  
  45.   document.write(i+"<br>");  
  46. }  
  47. }  
  48.   
  49. ciklus(a);  
  50. ciklusfolyt(a);  
  51.   
  52. b=a.valueOf();  
  53. delete(b['b']);  
  54. z="";  
  55. for (i in b) z+=i+",";  
  56. document.write("<br>"+z+"<br>");  
  57.   
  58. s="";  
  59. for (i in a) s+=i+",";  
  60. document.write("<br>"+s+"<br>");  
  61. document.write("valueof a:"+a.toString()+"<br>");  
  62. </script>  
  63.   
  64.  </head>  
  65.  <body>  
  66.   
  67. </body>  
  68. </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 :)
  1. a=[];  
  2. a['a']=1;  
  3. a['b']=2;  
  4. a['c']=3;  
  5. a['d']=4;  
  6. a['e']=5;  
  7. a['f']=6;  
  8. a['g']=7;  
  9.   
  10. s="";  
  11. for (i in a) s+=i+",";  
  12.   
  13. document.write(s+"<br><br>");  
  14.   
  15. var valami="c";  
  16. var mem ="";  
  17.   
  18. function ciklus(obj)  
  19. {  
  20.   
  21.     for (var i in obj)  
  22.     {  
  23.         document.write(i+"<br>");  
  24.         if (i!=valami) continue;  
  25.   
  26.         mem = i;  
  27.         document.write("szakad itt:"+i+"<br>");  
  28.         break;  
  29.     }  
  30.     delete this.i;  
  31. }  
  32.   
  33.   
  34. function ciklusfolyt(obj)  
  35. {  
  36.     var cont = false;  
  37.     for (var i in obj)  
  38.     {  
  39.        if (cont) mem = i;  
  40.        if (i!=mem ) continue;  
  41.          
  42.        cont = true   
  43.        document.write(i+"<br>");  
  44.   
  45.     }  
  46. }  
  47.   
  48.   
  49. ciklus(a);  
  50. 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 :)
  1. function myObj(){  
  2.     this['a']=1;  
  3.     this['b']=2;  
  4.     this['c']=3;  
  5.     this['d']=4;  
  6.     this['e']=5;  
  7.     this['f']=6;  
  8.     this['g']=7;  
  9. }  
  10. var testObj = new myObj();  
  11.   
  12.   
  13. s="";  
  14. for (i in testObj) s+=i+",";  
  15.   
  16. document.write(s+"<br><br>");  
  17.   
  18. function ciklus(obj)  
  19. {  
  20.   
  21.     for (var i in obj)  
  22.     {  
  23.         if(typeof(obj[i]) != 'undefined' && i!=breaker)  
  24.         {  
  25.             document.write(i+"<br>");  
  26.             obj[i] = undefined;  
  27.         }  
  28.         else if (i==breaker)  
  29.         {  
  30.             document.write("szakad itt:"+i+"<br>");  
  31.             break;  
  32.         }  
  33.     }  
  34.   
  35. }  
  36.   
  37. var breaker = 'c';  
  38. ciklus(testObj);  
  39.   
  40. var breaker = 'e';  
  41. ciklus(testObj);  
  42.   
  43. var breaker = undefined;  
  44. 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