什么函数作为.SelectMany()在jQuery?

让我再解释一下:

我们知道jQuery中的map函数的作用是.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/
如果我们select了许多,“l2”应该是8。

[注意]请不要坚持这个例子,上面的代码只是显示SelectMany()的意思,否则很容易说出$(“tr”)。

希望它是清楚的。

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]

你要这个:

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

现场演示: http : //jsfiddle.net/8aLFQ/12/

你会踢自己:

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

这是你珍惜的生活中简单的事情。 – 关丹

编辑 :哇,这会教我不要彻底testing答案。

该手册说map变平了arrays,所以我认为它会扁平化一个类似数组的对象。 不,你必须明确地转换它,像这样:

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

事情应该尽可能简单,但并不简单。 – 艾尔伯特爱因斯坦

$.map需要返回一个值(或一个值的数组)。 你正在返回的jQuery对象被用作“值”而不是“数组”(这会变平)

所有你需要做的就是返回DOM元素的数组。 jQuery提供了一个.get()方法,它从一个select中返回一个纯数组。

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

当然,我知道这是一个非常人为的例子,因为$("tr").children()用less得多的函数调用来做同样的事情。

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

不知道.selectMany()但你可以改变.selectMany()的位置,以获得所需的结果。

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

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

编辑

我想我可以更好地理解你的评论后的内容。

你可以调用$.makeArray(l2)来返回你正在做的8个对象/数组

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

对于常规数组,我有同样的问题,这是我可以在StackOverflow中find的唯一参考,所以我将添加我想出来的答案。

对于常规数组,可以使用

 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); });