1

毎秒関数を実行する次のコードがあります

var counter=setInterval(timer, 1000);
var global = [];
function timer()
{
    var strJSON = '[{"id":"1","timeout":"2013-09-11 03:00:00"},{"id":"2","timeout":"2013-09-11 03:00:00"}]';
    var currentRequest = [];
    var obj = jQuery.parseJSON(strJSON);
    for (var i=0; i<obj.length; i++) {
        var id = obj[i].id;
        var timeout = obj[i].timeout;
        if(id in global)
        {
            alert(id+' in array');
        } else {
            alert(id+' not in array');
            alert(id+' added');
            global.push(id);
        }
    }
}

グローバル変数を更新し続けるために使用していますが、重複はありません。ただし、スクリプトを実行すると、最初の実行で 2 番目の ID が追加されると言われますが、次の出力が得られるため、実際には追加されません。

/** ファーストラン **/

  • 1 配列にありません
  • 1 追加
  • 2 配列にありません
  • 2 追加

/** セカンドラン **/

  • 配列に 1 つ
  • 2 配列にありません
  • 2 追加

/** 3 回目の実行 **/

  • 配列に 1 つ
  • 2 配列

ここで何が間違っていますか?

4

1 に答える 1

5

id in global配列内の要素のチェックには使用されません。.indexOf代わりに使用する必要があります。

> "1" in ["1","2"]
true
> "2" in ["1","2"]
false

property in objectプロパティがオブジェクトに存在するかどうかを確認することです。

配列は 0-index であるため"0" in ["1","2"]、 と"1" in ["1", "2"]は true ですが、 ではありません"2"

だから変える必要がある

if(id in global)

if (global.indexOf(id) > -1)

indexOf注:配列のメソッドをサポートしていない古いブラウザには shim が必要です。

于 2013-09-11T10:01:19.527 に答える