我正在尝试使用javascript模拟cpu的先进先出作业调度,可以说:
var frames = 3, pages = [1,2,3,1,1,6,3,2], result = {};
我想循环实现这个结果:
1 | 1 | 1 | 1 | 1 | 6 | 6 | 6
| 2 | 2 | 2 | 2 | 2 | 2 | 2
3 | 3 | 3 | 3 | 3 | 3
显然,在结果数组中被替换的是之前推送的 on,在这个例子中是 '1'
我想出了这个解决方案:
for (var i = 0; i < pages.length; i++) {
for (var j = 0; j < frames; j++) {
if(!contains(pages[i], result)){
result.push({life : i, pages : pages[i]});
if (result.length > frames) {
var temp = result.pop();
result[getOldest(result)] = temp;
};
}
console.log(result);
};
};
如果你注意到我有一个名为的函数contains
,getOldest
它几乎描述了它的作用,contains
返回 true 或 false 并getOldest
返回包含最旧age
属性的对象的索引。
但似乎我做错了..而不是收到这个结果
1 | 1 | 1 | 1 | 1 | 1 | ... 1
2 | 2 | 2 | 2 | 2 | 2 | ... 1
2 | 2 | 2 | 2 | 2 | 2 | ... 1
根据要求,这两个功能:
var contains = function(needle, haystack) {
if(haystack.indexOf(needle) >= 0) return true;
return false;
}
var getOldest = function(arr) {
var oldest;
var count = Object.keys(arr).length;
for (var i = 0; i < count - 1; i++) {
if (arr[i].life < arr[i+1].life) {
oldest = Object.keys(arr)[i];
} else {
oldest = Object.keys(arr)[i+1];
}
};
return oldest;
}