【问题标题】:Skip an element with jQuery's $.map使用 jQuery 的 $.map 跳过一个元素
【发布时间】:2013-06-16 20:26:39
【问题描述】:

我有一个 jQuery 对象obj,它封装了一组输入元素。

我使用这段代码是为了从每个元素的值中创建一个数组:

$.map(obj, function(elem, i){
    return $(elem).val();
});

问题是有时某些输入字段包含无效值,我想在创建数组的过程中跳过它们。做一个简单的return false 似乎并没有跳过元素,而是在数组中插入一个false。

我想知道是否有一种方法可以不明确使用.each。

【问题讨论】:

    标签: jquery arrays skip


    【解决方案1】:

    由于是jQuery集合,你可以直接执行.map,然后使用.get,让它变成一个数组。

    var values = obj.map(function(){
        return this.value ? this.value : null;
    }).get();
    

    注意:上述检查将返回任何不为假的值。

    见test case on jsFiddle。

    【讨论】:

    • 我们也可以这样做var myArray = ['one', 'two', 'three']; var i = myArray.filter(function(n){ return n });我知道你用过get吗?
    • @PankajGarg 如果你有一个数组开始,当然可以。在这种情况下,OP 有一个 jQuery 集合,并且想要一个具有有效值的数组。将.map 与.get 结合使用将首先映射我们的jQuery 集合,然后将其转换为数组。请注意,与原生 Array 对象中的类似方法相比,jQuery 的 .filter 和 .map 的工作方式不同。
    【解决方案2】:

    我应该尝试不返回任何东西(void)来解决问题,不知道为什么我没有早点想到这一点。

    如果你想这样做,这里是修复:

    $.map(obj, function(elem, i){
        if($(elem).val().length == 0) return;
    
        return $(elem).val();
    });
    

    编辑

    我只是在这里测试了长度并省略了验证代码以保持同一主题

    【讨论】:

    • 这似乎不正确,无效值和空白/空值有区别吗?
    • 我建议return;获取undefined。也就是说,导致未定义而不是专门返回“未定义”。这会导致元素不被插入到数组中。但是,如果没有研究(或其他 cmets),我无法证实这一点。 Mozilla 声明未定义已返回。最好不要追得太远——我认为这个讨论之前已经发生过很多次了;)
    • @PankajGarg 我故意省略了整个验证代码只是为了保持主题......
    • @DanyKhalife 如果您还想丢弃空字符串'',检查长度是好的(我倾向于经常这样做)。
    • @AndrewGibson 这和原生的Array.map 不一样。根据the docs,返回null 或undefined 不会向数组中插入任何内容。
    猜你喜欢
    • 2010-12-27
    • 2014-09-08
    • 1970-01-01
    • 2023-04-07
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多