-2

私は自分の関数にこの下のループを持っています

x が <10 の場合はループしますが、10 より大きい場合は y < x の条件が満たされていても失敗します

function insert(x,y) {

   for (var shift = y; shift < x; shift++) {
      //get into loop for insert (9,2) but not for insert(10,2) 
   }       

}

これは実際の関数です。rapheal.js を使用して挿入前のシナリオを視覚化しようとしていますが、insertBeforeTo(9,2) で機能しますが、insertBeforeTo(10,2) を試してもループに入りません。

function insertBeforeTo(whichElementI, insertBeforeI) {

     var twhichElement = blocks[whichElementI];
     blocks[whichElementI].animate({ x: blocks[insertBeforeI].attr('x') }, 1000, ">");
     var shiftplusone = insertBeforeI;
     for (var shift = insertBeforeI; shift < whichElementI; shift++) {

         ++shiftplusone;
         blocks[shift].animate({ x: blocks[shiftplusone].attr('x') }, 1000, ">");// check  value actually changes

     }
}

反対票を投じる: 説明してもよろしいですか?

問題が見つかりました: デバッグ中に、「 」に whichElementI と insertBeforeI の値が表示されます。だから私はそれを文字列として受け取り、nnnnn と paxdiablo が正しく指摘したように、int ではなく文字列として受け取ると仮定します。

そこで、+whichElementI、+insertBeforeI などの単項プラス演算子を使用して問題を解決しました。

ありがとう

4

3 に答える 3

1

whichElementI と insertBeforeI の型が何かわかりませんが、*1 で数値に変換します。これは、いくつかの算術演算を抑えるのに役立つはずです。サニティチェックとして if(isNaN(some_var)==false){...} もチェックしたいかもしれません。

function insertBeforeTo(whichElementI, insertBeforeI) {

 var twhichElement = blocks[whichElementI];
 blocks[whichElementI].animate({ x: blocks[insertBeforeI].attr('x') }, 1000, ">");
 var shiftplusone = insertBeforeI*1;
 for (var shift = insertBeforeI*1; shift < whichElementI*1; shift++) {
    ++shiftplusone;
    blocks[shift].animate({ x: blocks[shiftplusone].attr('x') }, 1000, ">");// check x value  actually changes

  }
}
于 2012-06-26T02:08:27.487 に答える
1

まず、関数に渡すデータ型を確認する必要があります。

たとえば、これらはすべて出力を生成します。

insert ( 10,   2)
insert (  9,   2)
insert ( '9', '2')

ただし、次の場合はそうではありません。

insert ( '10', '2')

これは、string '10'が実際には string より小さいため'2'です。つまり、並べ替えや比較の際に文字列が数値的に扱われるのではなく、各文字が個別に比較されるため、最初の 12 の数字が次のように並べられます。

1
10
11
12
2
3
4
5
6
7
8
9

これは、次のコードで実際に確認できます (多くのオンライン JS ランナーの 1 つにあります)。

function insert(x,y) {
   for (var shift = y; shift < x; shift++) {
      //get into loop for insert (9,2) but not for insert(10,2) 
      document.write('x');
   }       
}
document.write('<br>10,2 as string: '); insert ('10','2');
document.write('<br>9,2 as string: ');  insert ( '9','2');
document.write('<br>9,2 as num: ');     insert (  9,  2);
document.write('<br>10,2 as num: ');    insert ( 10,  2);

出力:

10,2 as string: 
9,2 as string: xxxxxxx
9,2 as num: xxxxxxx
10,2 as num: xxxxxxxx

数値として扱いたい文字列がある場合はparseInt()、次のような方法があります。

var str42 = '42';
var num42 = parseInt (str42, 10);
于 2012-06-26T02:02:08.410 に答える
1

数値ではなく文字列値を使用して関数をうっかり呼び出していると思います。

insert("9", "2")
insert("10", "2")

...それよりも

insert(9, 2)
insert(10, 2)

たとえば、html 要素の属性から値を取得する場合、値は文字列になります。

string"2" < "9"isを使用しますがtrue"2" < "10"is false- 数値比較ではなく、辞書式 (辞書) 順序比較を行います。

関数をどちらの方法でも機能させたい場合は、文字列を数値に変換するように変更できます (その目的には単項プラス演算子を使用することをお勧めします)。

function insert(x,y) {

   x = +x;
   y = +y;

   for (var shift = y; shift < x; shift++) {
      //get into loop for insert (9,2) but not for insert(10,2) 
   }       

}
于 2012-06-26T02:02:12.023 に答える