我有以下 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/