【问题标题】:Getting array of values from jQuery object从 jQuery 对象获取值数组
【发布时间】:2011-04-05 10:07:14
【问题描述】:

我有以下对象:

$("input:checkbox:checked")
[
<input class=​"li_checker" type=​"checkbox" category_uid=​"1.3" category_language=​"da">​, 
<input class=​"li_checker" type=​"checkbox" category_uid=​"1.3.1" category_language=​"da">​
]

如果 jQuery 中有任何帮助器允许我获取所有元素的“category_uid”值并将其作为另一个数组返回?预期结果:

["1.3", "1.3.1"]

【问题讨论】:

  • 你试过.attr()吗? api.jquery.com/attr
  • @chchrist .attr() 只会返回集合中第一个元素的属性值。
  • 你可以使用 .each() 循环他们的 .attr()

标签: javascript jquery


【解决方案1】:

使用map():

var myArray = $("input:checkbox:checked").map(function(){
  return this.getAttribute("category_uid");
}).get();

【讨论】:

  • 重要的是要注意map 不返回一个数组,它返回一个jQuery 包装器围绕 一个数组。您必须使用.get() 来获取实际的数组。
  • 这是一个不错的解决方案。我的第一个想法是 Russell 和 bazmegakapa 建议的。
  • 我用了这个,因为它是最短的。
【解决方案2】:

按照 bpierre 的建议,使用 .map()。他的回答是正确的。

如果你对不同的属性需要这种行为,你不妨把 is 写成一个可重用的函数(“jQuery 插件”):

jQuery.fn.pluck = function(attr) {
  return this.map(function() {
    return this.getAttribute(attr);
  }).get();
};

$('input:checkbox:checked').pluck('category_uid'); // ["1.3", "1.3.1"]

附: category_uid 不是 HTML 中的有效属性。考虑改用自定义 data-* 属性,例如data-category-uid="foo".

【讨论】:

    【解决方案3】:

    只是为了好玩,第三种方式,这个使用attr

    var categories = [];
    $("input:checkbox:checked").attr("category_uid", function(index, value) {
        categories.push(value);
    });
    

    Live example


    题外话:如果您想在 HTML 元素上拥有任意的自定义属性,建议使用 HTML5 定义的 data- 前缀 (details)。您现在可以使用它,即使您不使用 HTML5 文档类型(这是 HTML5 只是在编码 - 并控制 - 当前实践的地方之一),而且它有点面向未来。

    【讨论】:

    • 我刚刚意识到这依赖于未记录的行为(如果函数不返回任何内容或返回 undefined,则不考虑该属性)。所以我记录了一个ticket 来记录它(当然,如果它不是所需的行为,也可以不记录)。
    • @bluszcz:别担心,玩得开心。 (西班牙,嗯?我会从你的用户名中获得捷克共和国......)
    【解决方案4】:
    var myarray=[];
    $("input:checkbox:checked").each(function () {
      myarray.push($(this).attr('category_uid'));
    });
    

    Live Demo

    【讨论】:

    • 我不认为他只需要检查的那些
    • 他在他的问题中提出了类似的建议,这就是我使用这个选择器的原因。
    【解决方案5】:

    类似

    var checked_cats = new Array();
    $("input:checkbox:checked").each(function() {
       checked_cats.push($(this).attr('category_uid'));
    });
    

    (未测试)

    附言看到你的推文了。

    【讨论】:

    • 这与我之前发布的答案有何不同?
    • @bazmegakapa:他使用new Array(),而不是更可靠、更简洁的[]。 ;-)
    • 如果您将某些内容“推送”到没有“new”关键字声明的数组中,旧版本的 ie 会抛出错误;)
    • @gion_13:我不知道你说的是哪个版本的 IE,但 [] 在驴的年代里一直是正确的数组文字语法(比如,在 JavaScript 被交给 ECMA 之前;很久以前在计算方面)。它适用于IE6。幸运的是,我没有(或不需要)访问比这更早的版本。
    • @gion_13: push 从 5.5 版开始在 IE 中受支持。即使在那个版本上,我也没有找到任何关于你所说的错误的证据。
    【解决方案6】:

    这是一种更“插件化”的方法:

    (function($){
    
        $.fn.getAttributes = function(attribute){
            var result = [];
            $(this).each(function(){
                 var a = $(this).attr(attribute);
                 if(a)
                     result.push(a);
            });
            return result;
        }
    })(jQuery);
    

    然后按如下方式使用:

    var result = $("input:checkbox:checked").getAttributes("category_uid");
    

    尚未测试,但应该可以正常工作。

    【讨论】:

    • 请注意:非常效率低下,您正在到处重复调用(到$(),到attr())。应用程序代码已经够糟糕了,但插件代码应该努力提高效率。 (另外,你忘了声明你的 $ 参数,但是好的形式 [打算] 使用一个。)
    • T.J.提出了很好的观点。另外,既然 jQuery 已经有了这样的方法,为什么还要重新发明轮子(.map())?
    猜你喜欢
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    • 2017-10-06
    • 2016-09-06
    相关资源
    最近更新 更多