【问题标题】:rewrite for loop as filter() javascript将 for 循环重写为 filter() javascript
【发布时间】:2016-12-27 22:21:09
【问题描述】:

我有以下 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 循环,但我想通过使用过滤器来做到这一点。

【问题讨论】:

  • 是否需要返回过滤后的列表?还是只是迭代运行.show() 方法?
  • 只需迭代运行show() 方法
  • @hackerrdave 只是迭代运行show() 方法
  • 如果不返回任何内容,则无需/指向使用 filter - for 循环或 Array.prototype.forEach() 会解决问题
  • 为什么要投反对票?

标签: javascript jquery loops filter


【解决方案1】:

这里不需要使用filter。由于您没有返回任何内容,forEach 将是更合适的功能。

应该这样做:

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

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

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


我可以使用过滤器吗

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

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

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

最终代码是一样的:

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

.show() 被视为副作用(过滤器功能真的不应该有)。

【讨论】:

  • 感谢您的回答。我知道​​ forEach 但我想使用 filter()。这可能吗?
  • 我的意思不是不尊重,这是可能的,但有点愚蠢。我会在我的答案中添加更多内容。
  • 为什么是哑巴?
  • 我在答案中添加了一些解释。这有帮助吗?
  • 感谢您的解释
【解决方案2】:

你可以像这样使用.filter()

allGenerators.filter(function () {
    return list.indexOf(+$(this).attr('data-generator')) > -1
}).show();

简化演示:

$('div').hide().filter(function (i) {
  return [1,3].indexOf(+$(this).attr('data-generator')) > -1
}).show();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div data-generator=1>test1</div>
<div data-generator=2>test2</div>
<div data-generator=3>test3</div>
<div data-generator=4>test4</div>

【讨论】:

  • 这是我最初尝试过的,但由于某种原因它不起作用
  • 如果您的列表包含数值,请确保也将属性值转换为数值,并使用单一的+。查看修改后的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-26
  • 2020-05-03
  • 2021-03-15
相关资源
最近更新 更多