javascript - 根据长度 : skip empty values 比较两个数组

标签 javascript jquery arrays

我有一个包含 4 个输入(甚至更多)的表单,用户可以在其中输入数字或什么都不输入。唯一的规则是,如果您在一个输入中输入了一个数字,而另一个输入中有相同的数字(没有重复),则您不能提交。您可以提交任意数量的空输入。

为了验证输入,我将所有输入数组的长度与仅具有唯一值的同一数组进行比较。如果他们有相同的长度就可以了。 我需要改进我的代码,因为现在它只有在用户输入所有输入字段时才有效。如果某些输入为空,则它们在数组中被视为具有唯一值,因为它们都具有“”作为值。因此,如果用户只输入一个数字,我会得到数组长度为 4,数组唯一为 2,但它应该是 1 和 1(跳过空白项)。

我正在考虑在 arr 上使用 splice(),但这是进行此验证的最佳方式吗? **编辑:如果数组是 ('1','','') 我应用了 splice 但我的代码给我的是 ('1','') 而不是我期望的 (1) ... * * 这是因为 splice 移除项并更改数组长度,使得 for 循环指向错误的索引。 任何想法? HTML:

<div class="sez-form">
    <fieldset>
        <legend>Messaggi inclusi</legend>
        <div class="percheckbox">
            <input class="checkseq" type="checkbox" value="1" name="messaggio[0]">
            Prova di messaggio che scorre<br>
            <label>Ordine: </label>
            <input class="seq" type="text" name="ordine[0]" maxlength="2" size="2">
        </div>

        <div class="percheckbox">
            <input class="checkseq" type="checkbox" value="3" name="messaggio[1]">
            Titoli di film<br>
            <label>Ordine: </label>
            <input class="seq" type="text" name="ordine[1]" maxlength="2" size="2">
        </div>

        <div class="percheckbox">
            <input class="checkseq" type="checkbox" value="6" name="messaggio[2]">
            Prova a testo fisso<br>
            <label>Ordine: </label>
            <input class="seq" type="text" name="ordine[2]" maxlength="2" size="2">
        </div>
        <br style="clear: both;">
    </fieldset>
</div>

JavaScript:

function uniqueArray(arr) {
    return $.grep(arr,function(v,k) {
        return $.inArray(v,arr) === k;
    });
}

$(document).ready(function() {
    $('#invia').click(function(e) {
        e.preventDefault();
        var arr = $(".seq").map(function(){ return $(this).val(); }).toArray();
        var empty = $(".seq").filter(function() {
            return this.value == "";
        })
    for (index = 0; index < arr.length; ++index) {
        if (arr[index]=='') {
            new_arr = arr.splice([index],1);
        }
        console.log(arr);
    }

        if(empty.length == $('.seq').length) {
            alert('Non hai scelto alcun messaggio per il workflow. Correggi per procedere.');
        }
        else if(uniqueArray(arr).length != $('.seq').length) {
            console.log(uniqueArray(arr));
            alert('Ci sono voci duplicate nella sequenza. Correggi per procedere.');
        }
        else if($('#dt_from').val()=='__/__/____ __:__') {
            alert('Scegli data e ora di inizio validit\u00E0 per il workflow');
        }
        else if($('#dt_to').val()=='__/__/____ __:__') {
            alert('Scegli data e ora di fine validit\u00E0 per il workflow');
        }
        else {
            ajaxSubmit();
        }
    });
});

最佳答案

这是另一种可能的处理方式。 Here is the working JSFiddle.这是代码:

$(function() {
    $("#submit").click(function() {
        //build a profile of the inputs
        var inputs = [];
        var values = [];
        var dups = false; //track duplicates on pass 1

        $(".seq").each(function(i, el) {
            var empty = (el.value == ""); //check if empty
            var exists = (!empty && $.grep(inputs, function(item, index) {
                return (item.Value === el.value);
            }).length > 0); //check if exists
            dups = (dups || exists); //track dups

            //add the new input item
            var obj = {
                Element: el,
                Value: el.value,
                Empty: empty,
                Exists: exists
            };
            inputs.push(obj);

            //conditionally add the sorting value
            if (!empty && !exists)
                values.push(el.value);
        });

        //Validate the inputs. If there are duplicates, don't submit
        $(".seq").css("background-color", "white"); //clear errors
        if (dups) {
            $(inputs).each(function(i, el) {
                if (el.Exists) 
                    el.Element.style.backgroundColor = "red";
            });
        } else {
            values = values.sort();
            alert(values);
        }
    });
});

使用此方法,最后您将获得一个数组 - inputs - 所有元素及其状态,以便您可以对特定字段提供错误处理。在我的示例中,错误字段变为红色。

alert 处,您有一个有效值的排序数组。

关于javascript - 根据长度 : skip empty values 比较两个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28413223/

相关文章:

jQuery 选择器值转义

ajax - jquery 多个ajax 检查是否全部完成? (顺序不重要)

javascript - 在 redux 中更新数组时如何避免状态变化

javascript - 合并相同级别的数组

javascript - JS : How to make the val() real-time

javascript - Jquery 设置不同的输入文本和值

javascript - 选择类别然后显示类别.尺寸

Javascript选择单选按钮更改php函数

objective-c - NSCF 阵列越界?

javascript - 更改菜单按钮而无需重新加载站点