将jQuery元素数组转换为jQuery包装的元素集

将jQuery元素数组转换为jQuery包装的元素集,jquery,Jquery,有没有什么优雅的方法可以把[$(div),$(span),$(li)]变成$(div,span,li) 我需要的是jQuery包装的元素集,而不是jQuery元素数组。我希望在尽可能少的代码行中完成这项工作,并且尽量减少(如果有的话)循环 编辑:对于那些对这个问题感到困惑的人来说,这段代码是使用console.log从firebug复制并粘贴到一组已经被选中的元素上的 $('li').each(function(){ $(this).doSomething(); })您可以这样做: v

有没有什么优雅的方法可以把
[$(div),$(span),$(li)]
变成
$(div,span,li)

我需要的是jQuery包装的元素集,而不是jQuery元素数组。我希望在尽可能少的代码行中完成这项工作,并且尽量减少(如果有的话)循环

编辑:对于那些对这个问题感到困惑的人来说,这段代码是使用console.log从firebug复制并粘贴到一组已经被选中的元素上的

$('li').each(function(){
    $(this).doSomething();

})您可以这样做:

var $temp = $();
$.each([$("li"), $("li"), $("li")], function(){
    $temp.push(this[0]);
})
$temp一个jQuery选择器中的所有元素

但我很好奇,是什么让您在拥有不同jQuery元素数组的情况下出现这种情况。您知道可以使用逗号选择不同的元素吗?比如
$(“li,ul>li:eq(0),div”)


编辑正如Guffa指出的,这只会添加每个部分的第一个元素
.add()
比这里的
.push()
更好。

如果您真正的意思是如何转换:

[$(a), $(b), $(c)]
结果:

$(a, b, c)
然后可以使用add函数将每个jQuery对象添加到另一个jQuery对象:

var x = $();  // empty jQuery object
$.each([$(a), $(b), $(c)], function(i, o) {x = x.add(o)});
此时,x将包含一个组合的jQuery对象,该对象是数组中先前的a、b和c jQuery对象的组合

如果没有
each()
循环,我找不到任何方法来完成它。
add()
函数接受DOM元素数组作为参数,但(至少根据)不接受jQuery对象数组


或者,您可以将每个jQuery对象转换为一个DOM元素,这可能会更有效率,因为它只在最后生成一个新的jQuery对象:

$([$(".a"), $(".b"), $(".c")].map(function(o) { return o.get() }));

Edit:我原以为jQuery支持所有
Array
方法,但不,这是我最初解决方案的一个工作版本,尽管有点奇怪,因为我坚持使用相同的方法:

var set; // The array of jQuery objects, 
         // but make sure it's an Array.
var output = set.pop();
$.each(set, function (_, item) { 
    return [].push.call(output, [].pop.call(item));
});

您可以使用
add
方法将jQuery对象中的元素复制到另一个对象。这将把数组中每个jQuery对象的所有元素
复制到jQuery对象

// Create an empty jQuery object
var items = $([]);
// Add the elements from each jQuery object to it
$.each(source, function(){ items = items.add(this); });
(在1.3.2版之前,
add
方法不支持添加jQuery对象,因此您需要使用
items.add(this.get());

非常适合重塑数组和/或jQuery集合

因此,给定这样的数组集:

var arrayOfJQ_Objects = [$("div"), $("span"), $("li")];


您只需要这一行代码():

$(arrayOfJQ_Objects).map (function () {return this.toArray(); } );
导致Firebug中出现此控制台显示:

jQuery(div, span, li)

另请参考。

以添加单个元素:

var $previousElements = $();
$previousElements.add($element); 
要将数组转换为jQuery元素集,请执行以下操作:

var myjQueryElementArray = [$element1, $element2, $elementN];
$(myjQueryElementArray ).map (function () {return this.toArray(); } );
var $previousElements = $(),
     myjQueryElementArray = [$element1, $element2, $elementN];

$previousElements.add($(myjQueryElementArray).map (function () {return this.toArray(); } ));
let elementList = [$("selector1"), $("selector2"), $("selector3"), ...];
要将元素数组添加到现有元素,请执行以下操作:

var myjQueryElementArray = [$element1, $element2, $elementN];
$(myjQueryElementArray ).map (function () {return this.toArray(); } );
var $previousElements = $(),
     myjQueryElementArray = [$element1, $element2, $elementN];

$previousElements.add($(myjQueryElementArray).map (function () {return this.toArray(); } ));
let elementList = [$("selector1"), $("selector2"), $("selector3"), ...];

如果您的环境支持
Array.prototype.reduce()

var jQueryCollection = [$("a"), $("div")]
                          .reduce(function (masterCollection, collection) {
                               return masterCollection.add(collection);
                          }, $());

.

假设您有一个jQuery元素数组:

var myjQueryElementArray = [$element1, $element2, $elementN];
$(myjQueryElementArray ).map (function () {return this.toArray(); } );
var $previousElements = $(),
     myjQueryElementArray = [$element1, $element2, $elementN];

$previousElements.add($(myjQueryElementArray).map (function () {return this.toArray(); } ));
let elementList = [$("selector1"), $("selector2"), $("selector3"), ...];
您只需在将返回jQuery集的数组上直接使用jQuery函数(
$()
):

let jQuerySetOfElements = $(elementList);

与公认的答案相比,我们可以使用
$.fn.toArray
作为传递给
$.fn.map
的参数:

var list = [$('<a>'), $('<b>'), $('<i>')];

$(list).map($.fn.toArray);

很久以前我也有类似的问题。我有一个巨大的表单,我需要获得每个
输入。因此,我的想法是将每个
输入
作为jQuery对象,并将其转换为jQuery包装的元素集。我该怎么做?这就是你问题的答案

  • 首先,您需要创建一个空数组作为jQuery对象,如下所示:
    let fields=$([])
    
  • 现在,使用一个包含选择器表达式的字符串来获取本例中所需的元素:
    'form#details:input'
    作为jQuery对象
  • 然后使用
    .each
    方法提取所需的信息,并将jQuery对象添加到jQuery集合包装器中:
    fields=fields.add(输入)
  • 你如何应用于这个问题? 如果您有一个元素列表
    let elements=[$(“#gw_id”)、$(“#erv_id”)、$(“#name”)
    您可以用
    元素替换
    $('form#details:input')

    另一种选择是使用
    .reduce
    vanilla js。在这个
    let set=$(elements.reduce((acc,cur)=>{return acc.concat(cur.get())},[])代码片段我们使用
    元素数组
    并应用
    reduce
    reduce有4个参数,但我们可以使用前两个参数,即
    累加器
    作为
    acc
    currentValue
    作为
    cur
    ,我们还使用箭头函数(
    =>
    )来减少回调。在这个回调中,我们将每个当前值连接到一个新数组中。最后,返回数组被包装到jQuery对象
    $()
    中。您还可以将
    元素
    替换为
    $('form#details:input')

    let fields=$([]);
    让元素=[$('gw_id'),$('erv_id'),$('name');
    $(函数(){
    log('字段列表:');
    $('form#details:input')。每个((索引,值)=>{
    让输入=$(值);
    设id=input.attr('id');
    让type=input.attr('type');
    字段=字段。添加(输入);
    if(id&&type=='text'){
    log('Input:'+id+'| Text:'+type);
    }
    });
    fields.addClass('ui-state-error');
    let set=$(elements.reduce((acc,cur)=>{
    返回acc.concat(cur.get())
    }, []));
    log('Set list:');
    set.each((索引,值)=>{
    让输入=$(值);
    设id=input.attr('id');
    让type=input.attr('type');
    log('Input:'+id+'| Text:'+type);
    });
    });
    
    .ui状态错误{
    背景:黄色;
    }
    
    
    GW Id
    

    ERV Id

    名称

    描述


    jQuery需要在引号之间调用元素:
    $(“li”)
    @jackJoe我想他是在直接引用firebug。你知道吗