2013-03-03 110 views
0

我試圖效仿的setInterval能夠循環:刪除對象的屬性,仍然通過該對象

var Animator=new (function(){ 
var jobs={ 
    interval:{} 
} 

var self=this; 
var assignedIntervalNum=0; 

this.setInterval=function(func,interval){ 
    jobs.interval[assignedIntervalNum]={ 
     func:func, 
     latest:Date.now()-interval, 
     interval:interval 
    }; 
    assignedIntervalNum++; 
    return assignedIntervalNum-1; 
} 

this.clearInterval=function(key){ 
    delete jobs.interval[key]; 
} 

var requestNextFrame=function(){ 
    var now=Date.now(); 
    for (var key in jobs.interval){ 
     if (jobs.interval[key].latest + jobs.interval[key].interval < now){ 
      jobs.interval[key].func(); 
      jobs.interval[key].latest=now; 
     } 
    } 

    setTimeout(function(){requestNextFrame();},1); 
} 
requestNextFrame(); 
})(); 

但我不斷收到錯誤,指出jobs.interval [關鍵]是不確定的。所以我想刪除不會完全刪除該屬性,但只需將其分配給undefined!?

對於支持刪除對和循環每個對的鍵/值存儲,我有哪些選擇?

編輯

我的壞!

在函數func()中存在對clearInterval的調用,所以導致錯誤的行是jobs.interval [key] .latest = now;剛剛刪除之後。

所以是的,JavaScript對象仍然是一個鍵/值存儲,支持通過他們每個人的去除對和循環不錯的選擇

+0

是的,它會刪除該屬性,但訪問不存在的屬性時會返回默認值undefined。 – 2013-03-03 22:28:20

+0

'delete'確實從對象中刪除屬性。雖然訪問一個未定義的屬性默認爲'undefined',但你可以通過使用'hasOwnProperty'方法或者'in'運算符來檢查一個對象是否有一個屬性(區別在於'in'也檢查原型鏈屬性...) – hugomg 2013-03-03 22:28:27

回答

0

正如在問題中提到,這是一個錯誤!

0

「刪除」不會刪除該數組中的對象,它設置對象爲未定義的,所以這就是爲什麼你得到這個錯誤。

如果想從具有索引i的數組刪除對象時,可以使用:

array.splice(i, 1); 

其中1是要刪除起始於位置i的元素的數量。

如果你想從陣列中刪除「數組」的關鍵一個元素,你可以使用:

for (var i=0; i<array.length; i++){ 
    if (array[i]==key){ 
     array.splice(i, 1); 
     break; 
    } 
}