Имя: Пароль:
IT
Веб-мастеринг
Подскажите цикл на Javascript
,
0 D_Pavel
 
04.09.12
06:23
Нужно сделать цикл по такому алгоритму:

Объект = ПервыйОбъект;
Выполнять до тех пор пока не будет Объект == ПоследнийОбъект
  Действие(Объект);
  Объект = Объект.Следующий;
КонецЦикла


Причем ПоследнийОбъект тоже должен попасть на выполнение.
1 skunk
 
04.09.12
06:25
что за объект?
2 Rie
 
04.09.12
06:26
Объект = ПервыйОбъект
do {
  Current = Объект;
  Действие(Объект);
  Объект = Объект.Следующий;
} while (Current!=ПоследнийОбъект);
3 D_Pavel
 
04.09.12
06:29
(1) Любой объект у которого есть ссылка на следующий.
(2) Спасибо.
4 D_Pavel
 
04.09.12
06:34
Еще вот так придумал, без дополнительной переменной:

do {
   if (!Объект)
       Объект = ПервыйОбъект ;
   else
       Объект = Объект.Следующий;
   Действие(Объект);
} while (Объект!=ПоследнийОбъект);
5 Rie
 
04.09.12
06:39
(4) Зачем на каждом шаге цикла делать дополнительную проверку?
Если уж очень хочется без дополнительной переменной, то
Объект = ПервыйОбъект;
do {
  Действие(Объект);
  if (Объект==ПоследнийОбъект) break;
  Объект = Объект.Следующий;
} while(1)
6 Rie
 
04.09.12
06:40
(по хорошему надо бы не только на последний объект, но и на null проверять - ибо программист предполагает, а оно по всякому бывает).
7 smaharbA
 
04.09.12
06:53
for (;x=x.next;x!=y){};
8 smaharbA
 
04.09.12
06:53
наоборот только
9 Rie
 
04.09.12
06:59
(7) Не взлетит. Проверка не даст выполниться телу цикла при x==ПоследнийОбъект
10 smaharbA
 
04.09.12
07:07
(9) все взлетит
11 smaharbA
 
04.09.12
07:30
for (;x!=y;x=x.next){};
12 D_Pavel
 
04.09.12
07:48
(11) Не взлетит. Первый объект не обработается.
13 D_Pavel
 
04.09.12
07:49
(5) тоже можно.
14 Rie
 
04.09.12
07:51
(10) Не взлетит.

function Cons(x, y) {
   this.hd = x;
   this.tl = y;
}

var
   a = new Cons(1,new Cons(2, new Cons(3,null)));
var
   b = new Cons(5,new Cons(6,new Cons(7,a)));
var
   t = b;
for(; t!=a; t=t.tl) {
   alert(t.hd);
}
выдает
5 6 7
но никак не 5 6 7 1
15 smaharbA
 
04.09.12
08:01
(12) с чего это ?
16 smaharbA
 
04.09.12
08:02
for(; !t; t=t.tl) {
  alert(t.hd);
}
17 Rie
 
04.09.12
08:03
(16) Это - несколько иная задача, нежели в (0).
18 smaharbA
 
04.09.12
08:06
вернее for(; t; t=t.tl)
19 Rie
 
04.09.12
08:14
(18) В (0) речь идёт не о сравнении с null, а с неким ПоследнийОбъект.
20 orefkov
 
04.09.12
10:01
for(var obj = firstObj; obj ; obj = obj.next)
{
   action(obj);
   if(obj == lastObj)
       break;
}
21 orefkov
 
04.09.12
10:11
for(var obj = firstObj; obj ; obj = obj == lastObj ? null : obj.next)
  action(obj);
22 D_Pavel
 
06.09.12
08:51
Спасибо