Создайте коллекцию объектов jQuery из отдельных объектов 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;
};

В этой функции я пытаюсь создать коллекцию jQuery из отдельного объекта jQuery. Как я могу это сделать?

Код ниже не работает:

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

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

Ответы

Ответ 1

.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/.

Ответ 2

.add возвращает новый объект и не изменяет старый.

Попробуйте изменить:

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

To:

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

Кроме того, $([]) не требуется, вы можете просто сделать var result = $();