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 将不接受 or (||) 三元运算符,或任何人提供其他简短方法..请

提前致谢。

4

3 回答 3

1

"$,grep 不接受 or (||) 三元运算符"

是的,它会的。$.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;
});
于 2013-06-20T10:15:38.470 回答
1

实际上,运行此代码:

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

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

没有-操作or( ||)。这是一个and. 如果您在一个条件下过滤列表,然后在第二个条件下过滤相同的列表,它将同时在两个条件下过滤(an and);不在其中一个(一个or)上。

您需要做的是&&在新代码中使用:

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

编辑:

此外,就像提到的其他一些答案一样,您应该注意优先级。将个别情况用括号括起来(就像我在上面添加的那样)。

于 2013-06-20T10:16:41.743 回答
0

我认为这与运算符优先级有关;+的优先级高于!=。逻辑也有问题,您要检查该值是否不是其中一个。

尝试将行更改为:

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

参考:JavaScript 运算符优先级

于 2013-06-20T10:15:14.040 回答