我使用这样的javascript模拟了先进先出的作业调度,我认为它起初很完美,但意识到它在某些条件下不起作用..
Array.prototype.fifo = function(frames) {
var results = [], result = [];
for (var i = 0; i < this.length; i++) {
result = result.slice(0);
var inObjects = result.inObjects('page', this[i]);
if(result.length == frames && !inObjects) {
result[i%frames] = page: this[i];
} else if (!inObjects) {
result.push(page: this[i]);
}
results.push(result);
};
return {result: results};
};
现在,如果你能看到模数,我认为是造成问题的。
// eg
[1,2,3,4,5,6].fifo(3);
// returns
[1], [1,2], [1,2,3], [4,2,3], [4,5,3], [4,5,6]
虽然这是正确的,但如果数字i
等于frames
并且modulo'ed
时,排序将会失败,余数将为零,因此无效。
// e.g.
// [1,1,1,2,3,4,5,6].fifo(3)
// returns
// [1], [1], [1], [1,2], [1,2,3], [1,2,4], [5,2,4], [5,6,4]
我最好的选择是将age
的属性保存到每个页面并将其作为对象推送,以跟踪谁将被替换。你怎么看?有没有更简单的方法来做到这一点。
修改
对于那个Array.prototype.inObject
,我正在检查当前值是否在对象数组中。
Array.prototype.inObjects = function(key, value) {
for (var i = 0; i < this.length; i++) {
if(this[i].hasOwnProperty(key) && this[i][key] == value){
return true;
}
};
return false;
};