2013-06-20 41 views
0

在我的表單中,只是在從服務器加載後更改了已更改的值。對於我這樣做的功能:

$(checkBox).each(function(i,el){ 
      status.push($(el).prop("checked")); 

      $(el).click(function(){ 
       var clickedIndex = checkBox.index($(this)); 
       var prevStatus = status[clickedIndex]; 

       if(prevStatus !== $(this).prop("checked")){ 
        statusChanged.push($(this).val() + ($(this).prop("checked") ? add.toLowerCase() : remove.toLowerCase())); 
       }else{ 
        var that = $(this); 
        statusChanged = $.grep(statusChanged, function(value) { 
         return value != that.val() + add.toLowerCase() 
        }); 

        statusChanged = $.grep(statusChanged, function(value) { 
         return value != that.val() + remove.toLowerCase() 
        }); 
       } 

       console.log(statusChanged); 

      }) 

     }) 
在此功能

,在其他部分(statusChanged)我打電話的$ .grep功能2倍"add""remove" - 的情況下,如果我寫這樣的功能(那一部分)

var that = $(this); 
statusChanged = $.grep(statusChanged, function(value) { 
    return value != that.val() + add.toLowerCase() || that.val() + remove.toLowerCase() //not working 
}); 

不工作..?這裏有什麼問題或$,grep不會接受或(||)三元運算符,或者任何一個給出其他簡短的方法..請提前致謝。

回答

1

「$,grep的將不接受或(||)三元運算符」

是的,它會。 $.grep()期望你的函數返回一個布爾值,但它不關心你如何得到布爾值。

如果你的問題是如何檢查value不添加或再取出就可以做到這一點:

var that = $(this); 
statusChanged = $.grep(statusChanged, function(value) { 
    return value != that.val() + add.toLowerCase() 
      && value != that.val() + remove.toLowerCase(); 
}); 

也就是說,測試value不加value不刪除 - 但它可以是任何其他值。

這似乎有點令人討厭的是做呼叫每次回調雖然調用時.val().toLowerCase(),所以我可能會做這樣的事情:

var val = $(this).val(), 
    valAdd = val + add.toLowerCase(), 
    valRemove = val + remove.toLowerCase(); 
statusChanged = $.grep(statusChanged, function(value) { 
    return value != valAdd && value != valRemove; 
}); 
0

我認爲這與操作符優先級有關; +!=有更高的前提。 此外,邏輯錯誤,你想檢查值是既不是這一個或其他。

嘗試改變行:

return (value != that.val() + add.toLowerCase()) && (value != that.val() + remove.toLowerCase()); 

參考:JavaScript Operator Precendence

1

事實上,運行此代碼:

statusChanged = $.grep(statusChanged, function(value) { 
    return value != that.val() + add.toLowerCase() 
}); 

statusChanged = $.grep(statusChanged, function(value) { 
    return value != that.val() + remove.toLowerCase() 
}); 

做一個or -operation(||)。這是一個and。如果在一種情況下過濾列表,然後在第二種情況下過濾相同的列表,它將在兩種條件(and)下過濾;不在其中之一(or)。

你需要做的是在新的代碼中使用&&

var that = $(this); 
statusChanged = $.grep(statusChanged, function(value) { 
    return (value != that.val() + add.toLowerCase()) && (value != that.val() + remove.toLowerCase()); 
}); 

編輯:

另外,像一些提到的其他答案,你應該小心與優先級。將各個案例放在括號中(就像我上面添加的那樣)。