如何避免对同一组元素使用过滤器两次

时间:2015-09-16 17:59:17

标签: javascript jquery

我试图将两种类型的输入分成他们自己的jQuery包装集,因为它们需要根据id是否包含'-add-new-'而被不同地处理。我知道我可以使用过滤器两次执行此操作,如下所示:

var seriesTabInputs = $msSeriesTabs.find('input').filter(function() {
    return $(this).attr('id').indexOf('-add-new-') == -1;
});

var addNewTabInputs = $msSeriesTabs.find('input').filter(function() {
    return $(this).attr('id').indexOf('-add-new-') >= 0;
});

然而,对我来说,过滤两次似乎效率低下,因为我知道它需要第二次循环。有没有办法避免这种情况?

3 个答案:

答案 0 :(得分:2)

尝试如下:

var addNewTabInputs = $msSeriesTabs.find('input[id*="-add-new-"]');
var seriesTabInputs = $msSeriesTabs.find('input[id]:not([id*="-add-new-"])');

OR

var addNewTabInputs = $msSeriesTabs.find('input[id*="-add-new-"]');
var seriesTabInputs = $msSeriesTabs.find('input[id]').not(addNewTabInputs);

答案 1 :(得分:1)

为了提供使用特定选择器的替代方法,您可以遍历jQuery集并随时构建两个集合。由于应用于集合的操作不同,我不知道这会更快。

INSERT INTO uniqueEntries 
  SELECT actualEntries.* 
  FROM actualEntries 
  LEFT JOIN uniqueEntries 
  ON uniqueEntries.User_ID = actualEntries.User_ID 
  WHERE uniqueEntries.User_ID IS NULL 
  GROUP BY User_ID

答案 2 :(得分:0)

除非您处理大量元素,否则避免过滤两次可能并不那么重要。此外,当您过滤两次时,有一些内容可以说明代码的一致性。

话虽如此,有一种方法可以避免过滤两次,甚至可能是教学的;下面是一些可用于实现此目的的代码。

首先,我们创建一个可以添加的空包装集,这可以通过var seriesTabInputs = $(false);来实现。有关详细信息,请参阅this write-up

然后在过滤器内部,我们有条件地添加到seriesTabInputs,但请注意我们执行此操作的方式:我们不断重新分配seriesTabInputs = seriesTabInputs.add($(this));如果您只是在没有seriesTabInputs.add($(this))的情况下调用seriesTabInput分配给var seriesTabInputs = $(false); var addNewTabInputs = $msSeriesTabs.find('input').filter(function() { if ($(this).attr('id').indexOf('-add-new') >= 0) { return true; } else { seriesTabInputs = seriesTabInputs.add($(this)); } }); ,最终会得到一个空数组。请参阅jQuery docs for .add(),它给出了一个类似的错误示例,并声明此类用法"不会保存添加的元素,因为.add()方法会创建一个新的集合"。

{{1}}