Knockout:在可观察数组中搜索零

时间:2016-08-11 10:21:37

标签: knockout.js

我有一个行列表,我想设置一个布尔标志,具体取决于它们中的任何一个是否将WeekHrs属性设置为零。 所以我有这个代码可行。但是,由于ForEach循环应该在标志设置为false时中断,因此效率很低。 那么必须有更好的方法吗?

self.isFull = function () {
    var isFull = true;
    ko.utils.arrayForEach(self.Lines(),
        function (line) {
            if (line.WeekHrs() === 0) {
                isFull = false;
            }
        });
    return isFull;
},

我查看了其他实用程序,但我无法弄清楚如何使用它们来解决这个问题。

1 个答案:

答案 0 :(得分:2)

现代浏览器实现Array.prototype.someevery,可以随时返回。当测试方法返回every时,false返回,当测试方法返回true时,有些返回。

self.isFull = function() {
  return self.Lines().every(function(line) {
    return line.WeekHrs() !== 0;
  });
};

self.isFull = function () {
  return !self.Lines().some(function (line) {
    return line.WeekHrs() === 0;
  });
}

请注意,如果需要,您还可以在computed中使用此方法:

self.isFullComputed = ko.pureComputed(self.isFull)

编辑完整性:正如评论中所建议的那样,您当然可以使用常规for循环:

self.isFull = function() {
  var allLines = self.Lines(),
      length = allLines.length,
      i;

  for (i = 0; i < length; i += 1) {
    if (line.WeekHrs() === 0) {
      return false;
    }
  }

  return true;
};

此外,如果您需要支持&lt;

,则可以实施建议的polyfill。 IE9。