什么函数在jQuery中充当.SelectMany()?

时间:2011-07-25 18:50:54

标签: javascript jquery linq

让我解释一下:

我们知道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();

希望它足够清楚。

6 个答案:

答案 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(); });

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

答案 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()做了同样的事情而且函数调用次数要少得多。

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

答案 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;

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

修改

我想我更好地理解你在发表评论后所做的事情。

您可以调用$.makeArray(l2)来返回您所追求的内容......即8个对象/数组

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