Подтвердить что ты не робот

Какая функция действует как .SelectMany() в jQuery?

Позвольте мне объяснить подробнее:

мы знаем, что функция отображения в jQuery действует как .Select() (как в LINQ).

$("tr").map(function() { return $(this).children().first(); }); // returns 20 tds

теперь вопрос в том, как мы можем иметь .SelectMany() в jQuery?

$("tr").map(function() { return $(this).children(); }); // returns 10 arrays not 20 tds!

вот мой пример в действии: http://jsfiddle.net/8aLFQ/4/
"l2" должно быть 8, если у нас есть selectMany.

[ПРИМЕЧАНИЕ], пожалуйста, не придерживайтесь этого примера, выше код должен просто показать, что я имею в виду под SelectMany(), в противном случае очень легко сказать $( "tr" ). children();

Надеюсь, что это достаточно ясно.

4b9b3361

Ответ 1

map будет сглаживать собственные массивы. Поэтому вы можете написать:

$("tr").map(function() { return $(this).children().get(); })

Вам нужно вызвать .get(), чтобы вернуть собственный массив, а не объект jQuery.

Это будет работать и с обычными объектами.

var nested = [ [1], [2], [3] ];
var flattened = $(nested).map(function() { return this; });

flattened будет равно [1, 2, 3].

Ответ 3

Ты собираешься пинать себя:

$("tr").map(function() { return [ $(this).children() ]; }); 

Это простые вещи в жизни, которые вы цените.  - Фред Кван

ИЗМЕНИТЬ: Вау, это научит меня не тщательно тестировать ответы.

В руководстве говорится, что map выравнивает массивы, поэтому я предположил, что он сгладит массивный объект. Нет, вам нужно явно преобразовать его, например:

$("tr").map(function() { return $.makeArray($(this).children()); }); 

Все должно быть как можно проще, но проще. - Альберт Эйнштейн

Ответ 4

$.map ожидает, что возвращается значение (или массив значений). Объект jQuery, который вы возвращаете, используется как "значение" вместо "массива" (который сжимается)

Все, что вам нужно сделать, это вернуть массив элементов DOM. jQuery предоставляет метод .get(), который возвращает простой массив из выделения.

$("tr").map(function() { return $(this).children().get() });

Конечно, я понимаю, что это очень надуманный пример, поскольку $("tr").children() делает то же самое с гораздо меньшими вызовами функций.

http://jsfiddle.net/gnarf/8aLFQ/13/

Ответ 5

Не уверен в .selectMany(), но вы можете изменить положение .children, чтобы получить желаемый результат.

var l2 = $("tr").children().map(function() { return $(this); }).length;

http://jsfiddle.net/8aLFQ/5/

ИЗМЕНИТЬ

Думаю, мне лучше понять, что вы после комментариев.

Вы можете вызвать $.makeArray(l2), чтобы вернуть то, что вы после..., это 8 объектов/массивов

http://jsfiddle.net/8aLFQ/10/

Ответ 6

У меня был тот же вопрос для регулярных массивов, и это единственная ссылка, которую я мог найти в StackOverflow, поэтому добавлю ответ, который я придумал.

Для регулярных массивов вы можете использовать

Array.prototype.selectMany = function (selector) {
    return this.map(selector).reduce(function (a, b) {
        return a.concat(b);
    });
};

Таким образом, [[1, 2], [3, 4], [5, 6, 7]].selectMany(function (a) { return a; }) оценивается как [1, 2, 3, 4, 5, 6, 7].

Чтобы использовать это в jQuery, вам необходимо преобразовать ваш набор jQuery в массив перед его использованием:

var result = $("tr").get().selectMany(function(a) { 
    return Array.prototype.slice.call(a.childNodes); 
});