2013-02-11 62 views
1

我有以下代碼: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

回答

3

在調用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

0

正如艾莉森說,在側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

0

你這裏,你是在如果條件是總是正確的.. this代表相同的數據在每個循環而你的情況是data和同去val也比較當前元素..你可以什麼嘗試用console.log(this)環內..

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

,所以你必須重新考慮你的邏輯.....你需要在(這)條件匹配究竟。

當匹配條件,並得到了該循環的

嘗試一下在fiddle