2013-03-03 111 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; 
    } 
}