我怎样才能打破或继续击倒阵型呢?

ozz*_*ozz 18 knockout.js

这是示例代码.我想打破(或继续)淘汰赛的ko.util.arrayForEach.

ko.utils.arrayForEach(items, function (item) {
    if (...) break;
    if (...) continue;
}
Run Code Online (Sandbox Code Playgroud)

bmo*_*ode 15

看起来你不能.这是arrayForEach的源代码(来自KO GitHub页面上的utils.js)

arrayForEach: function (array, action) {
    for (var i = 0, j = array.length; i < j; i++)
        action(array[i]);
},
Run Code Online (Sandbox Code Playgroud)

然而, Knockout规定ko.utils.arrayFirst将对数组中的每个项执行一个函数,并返回函数求值为true的第一个项.与filteredItems计算的observable类似,我们可以创建一个从搜索字段返回第一个匹配项:

//identify the first matching item by name
viewModel.firstMatch = ko.computed(function() {
    var search = this.search().toLowerCase();
    if (!search) {
        return null;
    } else {
        return ko.utils.arrayFirst(this.filteredItems(), function(item) {
            return ko.utils.stringStartsWith(item.name().toLowerCase(), search);
        });
    }
}, viewModel);
Run Code Online (Sandbox Code Playgroud)

更多细节可以在这里找到http://www.knockmeout.net/2011/04/utility-functions-in-knockoutjs.html

  • @TheMuffinMan j的要点是通过防止在每次循环迭代期间必须取消引用数组来节省几毫秒.请参阅[此StackOverflow问题](http://stackoverflow.com/questions/17989270/javascript-for-loop-performance-storing-array-length-in-a-variable).从接受该问题的答案中引用的jsperf来看,它在现代浏览器中看起来并没有多大区别. (2认同)

Mad*_*man 9

似乎ko.utils.arrayFirstko.utils.arrayFilter将比您当前的方法更符合您的需求.