1

我用这样的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;
};
4

0 回答 0