javascript - 将 for 循环重写为 filter() javascript

标签 javascript jquery loops filter

我有以下 JavaScript 代码:

var selectEnabledGenerators = function(generators) {
    //List of generator indexes to show
    var list = generators;
    var allGenerators = $(".generatorContainer");
    //Hide all generators
    allGenerators.hide();
    //maybe use filter here?
    for (var i = 0, max = list.length; i < max; i++) {
        $(".generatorContainer[data-generator=" + list[i] + "]").show();
    }
};

有什么方法可以使用filter() 重写for 循环吗? 我知道我可以使用 for each 循环,但我想通过使用过滤器来做到这一点。

最佳答案

不需要使用 filter这里。因为你没有退回任何东西 forEach将是更合适的功能。

应该做一些类似的事情:

list.forEach(item => $(".generatorContainer[data-generator=" + item + "]").show());

list.forEach(function(item){
    $(".generatorContainer[data-generator=" + item + "]").show();
});

如果你不喜欢/不能使用 lambdas


我还能使用过滤器吗

是的。但确实没有理由这样做。如果我看到你以这种方式使用过滤器,我会拒绝你的代码审查。

过滤器的用例是通过传入一个谓词函数(一个回答“这个是否保留”的函数)来快速减少项目列表。此函数的类型为 Array<T>将是 T => boolean .此过滤器函数将对每个项目执行谓词函数的代码块,然后检查该谓词函数的返回值。如果该返回值是真值,它将标记传递给谓词函数的对象,然后将所有产生真值的对象作为一个新数组返回。 forEach还将对每个参数执行一个函数,而无需执行返回值和管理新列表的额外工作。

如果不使用filter的返回结果,那么使用filter是没有意义的。它不仅没有用,而且会让以后阅读你的代码的人感到困惑,他们试图理解你为什么在这里使用过滤器。

最终代码是一样的:

list.filter(item => $(".generatorContainer[data-generator=" + item + "]").show());

.show()被视为副作用(哪些过滤器函数确实不应该)。

关于javascript - 将 for 循环重写为 filter() javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41352896/

相关文章:

javascript - 占位符 IE9 - Javascript 未在 IE9 中执行

javascript - 当鼠标指针超出浏览器视口(viewport)时捕获事件

Haskell:在状态中迭代,如何强制我想要的行为?

javascript - 多个div addClass和增量后缀

javascript - Node.js 脚本未完成就停止且没有声音

javascript - 播放期间跳过部分YouTube视频

javascript - 没有 JQuery 的 AJAX POST 到 PHP

javascript - 需要在抽屉按钮上绑定(bind)onclick事件

javascript - 从 AJAX 请求获取 JSON 数据并使用随机项填充

javascript - 如何重复 123 1231 直到长度目标