【问题标题】:How can I break or continue knockout's arrayforeach?我怎样才能打破或继续淘汰赛的arrayforeach?
【发布时间】:2012-07-25 11:43:03
【问题描述】:

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

ko.utils.arrayForEach(items, function (item) {
    if (...) break;
    if (...) continue;
}

【问题讨论】:

    标签: knockout.js


    【解决方案1】:

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

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

    然而 Knockout 提供了ko.utils.arrayFirst,它将针对我们数组中的每个项目执行一个函数,并返回函数计算结果为真的第一个项目。类似于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);
    

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

    【讨论】:

    • 初始化j的意义何在?你可以做i &lt; array.length
    • @TheMuffinMan j 的要点是通过避免在每次循环迭代期间必须取消引用数组来可能节省一些毫秒。见this StackOverflow question。从该问题的已接受答案中引用的 jsperf 来看,在现代浏览器上看起来并没有太大区别。
    • 在下面查看我的答案!
    【解决方案2】:

    只需使用 ko.utils.arrayFirst,它将在 array 上执行一个函数,并在 function 评估为 true 时立即返回/中断

    这是我最近使用的现实生活示例

    this.updateElement = function (model) {
        ko.utils.arrayFirst(that.list(), function (m) {
            if (model.formId() === m.formId()) {
                m.description(model.description());
                m.status(model.status());
                m.type(model.type());
            }
        });
    }
    

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 要求是关于性能的。我想在一个循环中做多个事情。
      • 使用简单的循环,它会为你节省几毫秒,因为在这种情况下你只会运行你的代码,而不是调用你传递给 arrayForEach 的子函数
      猜你喜欢
      • 1970-01-01
      • 2012-02-27
      • 2020-07-22
      • 2021-06-18
      • 1970-01-01
      • 2013-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多