从单独的jQuery对象创建jQuery对象集合

ale*_*exl 14 jquery

$.fn.sortByDepth = function() {
    var ar = [];
    var result = $([]);

    $(this).each(function() {
        ar.push({length: $(this).parents().length, elmt: $(this)});
    });
    ar.sort(function(a,b) {
        return b.length - a.length;
    });
    for (var i=0; i<ar.length; i++) {
        result.add(ar[i].elmt);
    };
    alert(result.length);
    return result;
};
Run Code Online (Sandbox Code Playgroud)

在这个函数中,我尝试从单独的jQuery对象创建一个jQuery集合.我怎样才能做到这一点 ?

以下代码不起作用:

result.add(ar[i].elmt);
Run Code Online (Sandbox Code Playgroud)

jsfiddle:http://jsfiddle.net/hze3M/14/

Mat*_*all 17

.add()返回一个新的jQuery对象.改变这一行:

result.add(ar[i].elmt);
Run Code Online (Sandbox Code Playgroud)

对此:

result = result.add(ar[i].elmt);
Run Code Online (Sandbox Code Playgroud)

但这仍然行不通

从jQuery 1.4开始,.add()的结果将始终按文档顺序返回(而不是简单的连接).

所以你只需要使用一个vanilla JS数组,push()将已排序的元素放入其中,然后$()使用整个事物.


其他代码清理:

$.fn.sortByDepth = function() {
    var ar = this.map(function() {
            return {length: $(this).parents().length, elt: this}
        }).get(),
        result = [],
        i = ar.length;


    ar.sort(function(a, b) {
        return a.length - b.length;
    });

    while (i--) {
        result.push(ar[i].elt);
    }
    return $(result);
};


var x = $('input').sortByDepth().map(function() {
    return this.id;
}).get().join(' - ');

$('#selection').text(x);
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/mattball/AqUQH/.