jQuery的每个功能不我希望的方式工作,以

问题描述:

我有以下代码:jQuery的每个功能不我希望的方式工作,以

$.each(data, function (key, val) { 
    var items = val.items; 
    console.log(val.id); 
    if (val.id === this.id) { 
    console.log('hello'); 
    } 
}); 

在上面的代码中,我通过data循环这是一个JSON对象。然后我比较validthis.id,其值为4。因此,我想要的是当val.id (4)等于this.id (4)然后日志hello,但是,因为data有几个对象,所以它记录几个hellos。

为什么以及如何才能让它只有在符合条件并退出该循环时才表示hello?

+0

里面'each'循环,'this' ==='val'。你最初的''this'在'.each'里放弃了它的价值。因此,在循环之前,将'this.id'保存在一个变量中,并将该变量与循环中的'val.id'进行比较。 – Jashwant 2013-02-11 06:22:07

在调用each()时定义的函数中,这=== val。

如果你想比较的this.id从调用每个前值,则需要对其进行缓存,就像这样:

var someId = this.id; 
$.each(data, function (key, val) { 
    var items = val.items; 
    console.log(val.id); 
    if (val.id === someId) { 
    console.log('hello'); 
    } 
}); 
+0

现在它甚至不会只显示你好一次。它们至少匹配一次。 – 2619 2013-02-11 06:17:28

+0

当我使用两个等于它的作品,但是当我使用三个然后它不。为什么? – 2619 2013-02-11 06:24:59

+0

@ x4ph4r这意味着其中一个是NUMBER(4),另一个是TEXT a.k.a. STRING(“4”)。当使用'=='(松散比较)时,它们被认为是相等的,但是当使用'==='(严格比较)时不会被认为是相等的。 – TwiNight 2013-02-11 06:27:56

正如艾莉森说,在侧this函数是val,所以你需要某种缓存。 (当你只需要值,但不是关键,此功能是非常有用的,所以你可以有function(){...}和使用this代替)

另外,如果你想从.each回路断线,循环函数内部返回false:

var someId = this.id; 
$.each(data, function (key, val) { 
    var items = val.items; 
    console.log(val.id); 
    if(val.id === someId) { 
     console.log('hello'); 
     return false; 
    } 
}); 

如在documentation中指定的那样。

+0

我做到了,但现在它甚至不会显示你好。但它至少匹配一次值。 – 2619 2013-02-11 06:22:42

+0

您认为原始代码中的“this”是什么? 'data'?一些其他的对象? – TwiNight 2013-02-11 06:25:11

你这里,你是在如果条件是总是正确的.. this代表相同的数据在每个循环而你的情况是data和同去val也比较当前元素..你可以什么尝试用console.log(this)环内..

if(val.id === this.id){ //this will always be true 

,所以你必须重新考虑你的逻辑.....你需要在(这)条件匹配究竟。

当匹配条件,并得到了该循环的

尝试一下在fiddle