我有一个行列表,我想设置一个布尔标志,具体取决于它们中的任何一个是否将WeekHrs属性设置为零。 所以我有这个代码可行。但是,由于ForEach循环应该在标志设置为false时中断,因此效率很低。 那么必须有更好的方法吗?
self.isFull = function () {
var isFull = true;
ko.utils.arrayForEach(self.Lines(),
function (line) {
if (line.WeekHrs() === 0) {
isFull = false;
}
});
return isFull;
},
我查看了其他实用程序,但我无法弄清楚如何使用它们来解决这个问题。
答案 0 :(得分:2)
现代浏览器实现Array.prototype.some
和every
,可以随时返回。当测试方法返回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。