如何从$.each操作中返回?(jQuery)

9

例子:

var t = $.each(templos_cache, function(f,g){
 $.each(g.requer, function(h,j){
  if (parseFloat(g.id) == id){
   alert(j.nome); // OK, return 'afrodite'.
   return j.nome; // wrong, return [Object object].
  }
  });
  return '';
 });

看代码,我们可以看出问题所在...我可以将一个超出范围的集合存储在变量中,但我认为可能存在更加优雅的方法来解决这个问题。


跳出循环使用 return 还是 break? - Gabriele Petrioli
1
据我所知,这是不可能的,你需要将t设置为超出范围。 - Anton Strogonoff
4个回答

12
从回调函数中使用 return false; 就可以跳出 $.each() 循环。引用自jQuery文档的原话如下:

我们可以通过使回调函数返回 false 来在特定迭代中退出 $.each() 循环。 返回非 false 的值相当于在 for 循环中使用 continue 语句; 它将立即跳到下一个迭代。

编辑: 在意识到您可能需要返回一个值时,您可以简单地通过向回调函数传递对象来实现。由于对象是按引用传递的,所以这是可行的。请参见如何在 Javascript 中进行赋值期间附加字符串值? - 虽然这并不更加优雅,所以我会像 colinmarc 所说的那样只设置一个在 $.each 外部的变量。

2
这不是提问者所询问的内容! - colinmarc
@colinmarc 我刚刚意识到这一点 - 我已经修改了答案。 - Jack Murdoch

2

就我所知,设置一个变量似乎是最优雅的方法,就像你提到的那样:

var foo = '';
$.each(some_list, function(i, e){
   ...
   if(something) foo = 'stuff';
});

1

理论上,像这样的代码应该可以实现你想要的功能。它应该会遍历templos_cache,在内部循环中遍历g.requer,直到id匹配g.id为止。在这种情况下,它将设置returnValue,并跳出内部的$.each循环。在外部循环中,它检查是否已经设置了returnValue,如果是,则跳出循环。

我还没有实际测试过这个代码,但它看起来很可靠。

var returnValue = ''; 

$.each(templos_cache, function(f,g){
    $.each(g.requer, function(h,j){
        if (parseFloat(g.id) == id){
             returnValue = j.nome;
             return false;
        }
     });
     if(returnValue != ''){
         return false;
     }

});

var t = returnValue;

诚然,我喜欢Jquery,但这是一个很好的例子,显示了语言能够定义新控制结构(实际上并不在其自己的调用堆栈级别中执行)的时候非常有用。这将允许您实际返回您感兴趣的值,并干净地短路其余逻辑。 - RHSeeger
@RHSeeger:是的,没错,它肯定不完美。有时候一个普通的for循环是最好的选择。 - Patricia

1
你可能应该使用$.map代替:
var x = [1, 2, 3, 4, 5];
var y = $(x).map(function(i, n){
    return n < 4 ? n+1 : undefined;
});
// y == [2, 3, 4]

如果你只返回一个值,y 将会是 [val],你总是可以通过 y[0] 访问它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接