8

这可以以更简洁的方式完成吗?

var src = $('div');
var dest = [];

for ( var i = 0; i < src.length; i++)
    dest[i] = $(src[i]);

我只能想到这个,这仍然很冗长:

var dest = [];
$('div').each(function() { dest.push($(this)); });

jQuery 是否为这种情况提供了更好的方法?我找不到它。


要解决评论中反复出现的一些问题:

src[i]已经是一个 jQuery 对象,调用jQuery(src[i])不会做任何事情。

不,它是一个普通的 DOM 节点,根本没有任何 jQuery 包装。

只是出于好奇,为什么要这样做?

因为之后我需要对每个元素单独做很多处理。例如,我需要遍历所有这些以找到最高的,然后将其余的设置为相同的高度。之后,我需要获取它们的所有宽度并在此基础上执行一些布局(因此每个元素都根据其他元素的宽度获取其 x 和 y 坐标)。等等。

如果我可以使用 jQuery 提供的速记函数,所有这些操作都会更容易完成,但这意味着我需要单独包装每个元素($('div')只返回一个包装器)。而且由于我需要多次访问每个元素,我想通过只包装每个元素来提高性能,而不是每次访问。

4

2 回答 2

8

这正是map()它的用途。您正在遍历每个元素并将函数应用于元素并将其推送到新数组中。

var wrapped  = $.map($('div'), function(){ return $(this); });

或为了可读性

var wrapped  = $.map($('div'), function(val, i) {
    return $(val);
});
于 2013-05-16T09:36:37.597 回答
1

您不应该将 dom 节点重新转换为 jQuery 对象。

你应该尝试这样的事情,

var src = $('div');
var dest = [];

for ( var i = 0, l = src.length; i < l; i++) {
    dest[i] = src.eq(i);
}

console.log(dest);

甚至更好,

var src = document.getElementsByTagName('div');
var dest = [];
for ( var i = 0, l = src.length; i < l; i++) {
    dest[i] = $(src[i]);
}
console.log(dest);


我不太擅长 js perf,但这里有一个测试http://jsperf.com/eq-vs-vs-vanilla

于 2013-05-16T10:07:45.720 回答