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

15
$.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;
};

在这个函数中,我试图从单独的jQuery对象中创建一个jQuery集合。我该怎么做?

以下代码不起作用:

result.add(ar[i].elmt);

这个 JSFiddle 的链接是:http://jsfiddle.net/hze3M/14/

2个回答

18

.add() 方法返回一个新的 jQuery 对象。请将这行代码更改为:

result.add(ar[i].elmt);

转化为:

result = result.add(ar[i].elmt);

然而,这仍然不起作用

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

所以您只需使用一个普通的 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);

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


感谢您的代码清理,我很欣赏。Rocket 回答得更快,所以我接受了那个答案。 - alexl
@alexl:是的,他速度更快,但代码仍然无法工作(请参见我的最新编辑)。 - Matt Ball
如果add方法重新排序所有对象,那么所有代码都没有意义了...参数。 - alexl
没事,我没有看到最新的更新。我不知道你可以直接从数组创建一个 jQuery 集合,很高兴看到这一点。 - alexl

4

.add方法返回一个新对象,而不是修改旧对象。

尝试更改:

result.add(ar[i].elmt);

致:

result = result.add(ar[i].elmt);

此外,$([]) 是不必要的,你可以直接使用 var result = $();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接