让我解释一下:
我们知道jQuery中的map函数充当.Select()(如在LINQ中)。
$("tr").map(function() { return $(this).children().first(); }); // returns 20 tds
现在的问题是我们如何才能在jQuery中使用.SelectMany()?
$("tr").map(function() { return $(this).children(); }); // returns 10 arrays not 20 tds!
这是我的实例:http://jsfiddle.net/8aLFQ/4/
如果我们有selectMany,“l2”应为8。
[注意]请不要坚持这个例子,上面的代码只是显示SelectMany()的意思,否则很容易说$(“tr”)。children();
希望它足够清楚。
答案 0 :(得分:43)
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]
。
答案 1 :(得分:25)
你想要这个:
$("tr").map(function() { return $(this).children().get(); });
答案 2 :(得分:5)
你要踢自己:
$("tr").map(function() { return [ $(this).children() ]; });
这是你珍惜的生活中的简单事物。 - Fred Kwan
修改强>: 哇,这会教我不要彻底测试答案。
手册说map
使数组变平,所以我认为它会使类似数组的对象变平。不,你必须明确地转换它,如下:
$("tr").map(function() { return $.makeArray($(this).children()); });
事情应尽可能简单,但并不简单。 - 阿尔伯特爱因斯坦
答案 3 :(得分:4)
$.map
期望返回一个值(或值数组)。您返回的jQuery对象被用作“值”而不是“数组”(变得扁平化)
您需要做的就是返回DOM元素数组。 jQuery提供了一个.get()
方法,它从选择中返回一个普通数组。
$("tr").map(function() { return $(this).children().get() });
当然,我知道这是一个非常人为的例子,因为$("tr").children()
做了同样的事情而且函数调用次数要少得多。
答案 4 :(得分:2)
对于常规数组我有同样的问题,这是我在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);
});
答案 5 :(得分:1)
不确定.selectMany()
,但您可以更改.children
的位置以获得所需的结果。
var l2 = $("tr").children().map(function() { return $(this); }).length;
修改强>
我想我更好地理解你在发表评论后所做的事情。
您可以调用$.makeArray(l2)
来返回您所追求的内容......即8个对象/数组