【问题标题】:jQuery each and do I need to create a closure here?jQuery 每个,我需要在这里创建一个闭包吗?
【发布时间】:2013-08-28 05:19:11
【问题描述】:

我有以下使用 jQuery 和下划线的(缩短的数组):

var all_methods = ['locations', 'items', 'by-cocktails'];
var to_methods = [];
$.each(all_methods, (function (key, val) {
    if ($('.lm-search-options[data-action=' + val + ']').hasClass('del')) {
        console.log('to remove: ' + val); // <- only the last piece is moved out despite multiple pieces being here
        to_methods = _.without(all_methods, val);
    }
}));

我看到的行为是只删除了最后一个选定的 dom 元素(是的,我知道这不会赢得任何软件设计奖)。例如,如果要删除“位置”和“项目”,则仅删除“项目”。我看到的行为是因为这里需要一个新的闭包吗?

【问题讨论】:

  • 我认为使用_.filter 是更好的解决方案

标签: jquery closures underscore.js


【解决方案1】:

试试

var $opts = $('.lm-search-options');
var to_methods = _.filter(all_methods, function(val){
    return !$opts.filter('[data-action=' + val + ']').hasClass('del')
})

【讨论】:

  • 哦,至少我可以理解原来的答案:-);所以通过一系列元素进行过滤......谢谢,让我测试一下
  • @timpone 这似乎是一个更好的答案
  • 好的,有什么方法可以告诉我我在原件中做错了什么 - 我需要关闭它才能工作吗?将使用您的答案,因为它更短,但在过去一周只做了更多的 JS,并且一些(好的,全部)闭包语法/语义正在抛出一个循环。
  • @timpone 你的问题是你总是通过从all_methods 中删除最后一项来覆盖to_methods 的值
  • @timpone 就像在第一次迭代中 location 被删除,然后 to_methods 变为 ['items', 'by-cocktails'],但如果下一次迭代 items 被删除,而不是从修改后的数组中删除它(来自删除了哪个位置)您正在从包含所有元素的源数组中删除它,现在to_methods 变为['locations', 'by-cocktails'] 而不是['by-cocktails']
猜你喜欢
  • 2014-07-18
  • 1970-01-01
  • 2019-08-02
  • 2013-05-04
  • 2013-07-01
  • 2016-03-25
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
相关资源
最近更新 更多