2012-01-30 12 views
1

私はオンラインとオフラインの時間を比較する時間が必要です。オンライン時間よりも多くのオフライン時間がある場合 - 今回は削除する必要があります。ユーザーにタイムラインがない場合 - このユーザーを削除する必要があります。回を経由する場合とsmažujは次のとおりです:このデータ構造からjs配列からデータを削除するには?

私はこの問題を抱えている「未定義」の値が残っている - [未定義、未定義]とし、この条件を満たすことができない -

if (user.connectionTimes.length === 0) { 
     delete users[id]; 
    } 

がどのようにIこの問題を解決します?

Iは、以下のコードを使用:

 var users = []; 

     users[0] = { 
      userId: 1, 
      connectionTimes: 
       [ 
        {onlineTime:30, offlineTime:70}, 
        {onlineTime:50, offlineTime:75} 
       ] 
     }; 

     users[1] = { 
      userId: 2, 
      connectionTimes: 
       [ 
        {onlineTime:80, offlineTime:70} 
       ] 
     }; 

     users[2] = { 
      userId: 3, 
      connectionTimes: [] 
     }; 

     for(var i=0; i<users.length; i++) { 
     for(var j=0; j<users[i].connectionTimes.length; j++) { 
      if(users[i].connectionTimes[j].onlineTime < users[i].connectionTimes[j].offlineTime) { 
    delete users[i].connectionTimes[j];   
    //EDIT - this work - users[i].connectionTimes.splice(j, 1); 
    //j--; 
      } 
     } 
     if(users[i].connectionTimes.length == 0) { 
delete users[i]; 

      //EDIT - this work - users.splice(i, 1); 
      //i--; 
     } 
    } 

     console.log(users); 

答えて

4

deleteは、アレイ内の穴を残します。

スロット全体を実際に取り外すには、array.splice(index, 1)を呼び出します。
これは、すべての後続スロットを1つ下にシフトして穴を埋める。

逆ループでこれを行う必要があります。そうしないと、次の項目がスキップされます。

+0

どのように私は、この状態で「スプライス」この機能を使用していますか? 'if(connectionTime.onlineTime Jenan

+2

' user.connectionTimes.splice(i、1) '? – SLaks

2

deleteはオブジェクトからプロパティを削除しますが、配列内ではそのインデックスの値を単にundefinedに設定します。

var arr = [1, 2, 3]; 
delete arr[0]; 
//undefined, 2, 3 

アレイエントリを削除するには、spliceを使用します。だから、代わりに:

delete users[id]; 

あなたがしたい:

users.splice(id, 1); 
1

削除インデックスを削除しないであろう、だけで未定義の値に変わります。
あなたが探していることはスプライス(である)、これを試してみてください。

if (user.connectionTimes.length === 0) { 
    users[id].splice(id, 1); 
} 
関連する問題