2012-01-23 3 views
2

Мне нужно прочитать все время соединения. (ConnectionTimes) Мне нужно удалить строку - когда он будет находиться в автономном режиме более чем на сайте:Как удалить данные из объекта javascript из этой структуры данных?

userId: 1, 
    connectionTimes: 
     [ 
      {onlineTime:"11:10:30", offlineTime:"11:18:12"}, //delete 
      {onlineTime:"11:14:14", offlineTime:"11:52:41"} //delete 
     ] 

Удалить идентификатор пользователя - Когда раз соединение будет пустым.

userId: 1, //delete userid 
     connectionTimes: 
      [ 
       //empty connection 
      ] 

У меня есть эта структура данных:

var users = []; 

    users[0] = { 
     userId: 1, 
     connectionTimes: 
      [ 
       {onlineTime:"11:10:30", offlineTime:"11:18:12"}, 
       {onlineTime:"11:14:14", offlineTime:"11:52:41"} 
      ] 
    } 

    users[1] = { 
     userId: 2, 
     connectionTimes: 
      [ 
       {onlineTime:"8:08:14", offlineTime:"1:15:00"} 
      ] 
    } 

ответ

7

Вы можете удалить свойство из объекта JavaScript с удаления оператора:

var sampleObject = { 
    "key1": "value1", 
    "key2": "value" 
}; 
delete sampleObject["key2"]; 

или как это:

delete sampleObject.key2 

Смотрите Mozilla Developer Network JavaScript Reference для более фона на удаления оператора: https://developer.mozilla.org/en/JavaScript/Reference/Operators/delete

Ваш конкретный пример будет выглядеть примерно так:

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

    for(var i=0; i<=user.connectionTimes.length; i++) { 
     var connectionTime = user.connectionTimes[i]; 
     if (connectionTime.onlineTime < connectionTime.offlineTime) { 
      delete users[id]; 
      break; 
     } 
    } 
} 

Здесь является ссылкой на jsFiddle, показывающий код в действии: http://jsfiddle.net/Q86Jd/

+0

Здесь мне нужно - Не удалить пользователя, но только линии. 'if (connectionTime.onlineTime Jenan

+0

Работает: 'for (var i = 0; i Jenan

1

В основном вы хотите использовать что-то вроде этого:

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]; 
      j--; 
     } 
    } 
    if(users[i].connectionTimes.length == 0) { 
     delete users[i]; 
     i--; 
    } 
} 
1

Это довольно просто. В псевдокоде:

declare user, times 

for each index in users 
    set user = users[ index ] 
    set times = user.connectionTimes 

    if times is empty 
    then delete users[ index ] 

    else 
    declare onlineSecs, offlineSecs 

    for each index2 in times 
     set onlineSecs = timeInSeconds(times[ index2 ].onlineTime) 
     set offlineSecs = timeInSeconds(times[ index2 ].offlineTime) 

     if offlineSecs > onlineSecs 
     then delete times[ index2 ] 

В JavaScript команда служит для удаления переменной delete и может использоваться в массивах же, например delete someArray[ someIdx ];. Реализация timeInSeconds будет что-то вроде этого:

function timeInSeconds(timeWithColons) { 
    var hrsMinsSecs = "12:34:56".split(':'); 

    return (parseInt(hrsMinsSecs[0]) * 60 + 
      parseInt(hrsMinsSecs[1]) 
     ) * 60 + 
     parseInt(hrsMinsSecs[2]) 
    ; 
} 
2

Есть много способов, чтобы удалить вещи из массивов в JavaScript. Я могу думать о том, что это электрические сети

  • Оператор delete. Использование его задает выбранную позицию неопределенной и аналогично простому установлению элемента в значение null. (Основное отличие состоит в том, что удаление ключа приведет к его пропуску при повторении с помощью методов forEach и массива карт).

    var xs = [0,1,2]; 
    delete xs[1]; 
    console.log(xs); // [0, undefined, 2] 
    
  • Метод splice может удалить кусок или массив, перемещая остальные элементы влево, чтобы заполнить его.

    var xs = [0,1,2,3]; 
    xs.splice(2, 1); //index, ammount to remove 
    console.log(xs); // [0,1,3] 
    
  • Установка length собственность массива обрезает его. Это можно использовать, чтобы вручную удалить элементы старомодным способом, когда вам нужно больше контроля.

    var xs = [0,1,2,3]; 
    xs.length = 2; 
    console.log(xs); // [0,1] 
    xs.length = 4; 
    console.log(xs); // [0,1, undefined, undefined] 
    

Так что в вашем случае, мы могли бы сделать что-то вроде этого:

function filter_in_place(array, predicate){ 
    var j=0; 
    for(var i=0; i<arr.length; i++){ 
     var x = arr[i]; 
     if(pred(x)){ 
      arr[j++] = x; 
     } 
    } 
    arr.length = j; 
} 

for(var i=0; i < users.length; i++){ 
    filter_in_place(users[i].connections, function(conn){ 
     /*return if offline larger then online*/ 
    }); 
} 

filter_in_place(users, function(user){ return user.connections.length > 0; }); 
Смежные вопросы