什么函数作为.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得多的函数调用来做同样的事情。
不知道.selectMany()
但你可以改变.selectMany()
的位置,以获得所需的结果。
var l2 = $("tr").children().map(function() { return $(this); }).length;
编辑
我想我可以更好地理解你的评论后的内容。
你可以调用$.makeArray(l2)
来返回你正在做的8个对象/数组
对于常规数组,我有同样的问题,这是我可以在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); });