сравнение массивов - PullRequest
       8

сравнение массивов

0 голосов
/ 23 сентября 2010

Я пытаюсь создать уникальный список TaskID на основе выбора.Каждое задание может иметь максимум 2 компании.Моя проблема заключается в том, что сравнение TaskID ниже не удается.Мой код:

<script>
$().ready(function() { 

  $.validator.addMethod(
        "findRegex",
        function(value, element) {
            return /^.+::[1-9]\d{0,11}$/.test(value);
        },
        "Please check your input."
   );

    $('#myForm').validate({
            submitHandler: function(form){
                $("#formSub").html('<table style="font-size:11px; color:#333;"><tr><td><img border="0" src="images/ajax-loader.gif"/></td><td>Saving! Please wait...</td></table>');
                var options = { 

                    success: showResponse,
                    url:'addValidation2.cfm?t=1' 
                };
                $('#myForm').ajaxSubmit(options);
                return false;   
            }
    });

      $('select[name^=compName]').change(function() {
            var tid = $(this).attr('name').split('-')[1];
            var j   = $(this).attr('name').split('-')[2];
            var currTaskIDs = $("#taskIDList").val();

            // begin: create the task list:
            var arr = [];
            var arr2 = [];
            var arr3 = [];
            if (currTaskIDs != '') {
                if( $.inArray(currTaskIDs, arr2) == -1) {
                    arr2.push(currTaskIDs);
                }
            } 

            if( $.inArray(tid, arr) == -1) {
                arr.push(tid);
            } 

            arr3 = unionArr(arr,arr2);
            alert(arr3);
            $("#taskIDList").val(arr3);
            // end
        });

        unionArr = function(x, y) {
          var obj = {};
          for (var i = x.length-1; i >= 0; -- i)
             obj[x[i]] = x[i];
          for (var i = y.length-1; i >= 0; -- i)
             obj[y[i]] = y[i];
          var res = []
          for (var k in obj) {
            if (obj.hasOwnProperty(k))  
              res.push(obj[k]);
          }
          return res;
        }


    $("input[name^=compName-]").each(function() {
       $(this).rules("add", { findRegex: true });
    });
});
 </script>

<form id="myForm" name="myForm" method="post" action="">

task : 35
<select name="compName-35-1" id="compName-35-1">
    <option value=""></option>
    <option value="acme inc::30">acme inc::30</option>
    <option value="my company::54781">my company::54781</option>
    <option value="abc llc::42443">abc llc::42443</option>
    <option value="zzzz">zzzz</option>
</select> 

<select name="compName-35-2" id="compName-35-2" style="padding-left:20px;">
    <option value=""></option>
    <option value="acme inc::30">acme inc::30</option>
    <option value="my company::54781">my company::54781</option>
    <option value="abc llc::42443">abc llc::42443</option>
    <option value="zzzz">zzzz</option>
</select> 
<hr/>

  task : 36
<select name="compName-36-1" id="compName-36-1">
    <option value=""></option>
    <option value="acme inc::30">acme inc::30</option>
    <option value="my company::54781">my company::54781</option>
    <option value="abc llc::42443">abc llc::42443</option>
    <option value="zzzz">zzzz</option>
</select> 

<select name="compName-36-2" id="compName-36-2" style="padding-left:20px;">
    <option value=""></option>
    <option value="acme inc::30">acme inc::30</option>
    <option value="my company::54781">my company::54781</option>
    <option value="abc llc::42443">abc llc::42443</option>
    <option value="zzzz">zzzz</option>
</select> 
<hr/>

  task : 37
<select name="compName-37-1" id="compName-37-1">
    <option value=""></option>
    <option value="acme inc::30">acme inc::30</option>
    <option value="my company::54781">my company::54781</option>
    <option value="abc llc::42443">abc llc::42443</option>
    <option value="zzzz">zzzz</option>
</select> 

<select name="compName-37-2" id="compName-37-2" style="padding-left:20px;">
    <option value=""></option>
    <option value="acme inc::30">acme inc::30</option>
    <option value="my company::54781">my company::54781</option>
    <option value="abc llc::42443">abc llc::42443</option>
    <option value="zzzz">zzzz</option>
</select> 

<hr/>

<input type="submit" name="btnSave" id="btnSave" value="Save"/>
<hr/>
<input type="text" name="taskIDList"  id="taskIDList" value="" />
<div id="formSub"></div>

  1. Я выбираю две компании для задачи 35. В текстовом поле taskIDList отображается 35.
  2. Я выбираю две компании для задачи 36, текстовое поле taskIdList отображает: 36,36,35 <сбой> должно отображаться 36, 35.
  3. я выбираю одну компанию для задачи 37, taskIdList правильно добавляет 37 в список.Затем я меняю компанию, затем taskIdList становится 37,37,36,36,35:

как я могу убедиться, что список уникален?

заранее спасибо

1 Ответ

1 голос
/ 23 сентября 2010

Рассматривая это как проблему простого удаления дубликатов из вашего окончательного списка, вы можете написать небольшую функцию, подобную той, которая показана в этом SO-ответе .Оставляя в стороне любые проблемы с изменением объектов, которые вам не принадлежат , чтобы добавить эту функциональность (и тот факт, что это O (n ^ 2)), функция позволяет вам сделать это:

var theArray = [37,37,36,36,35];
var theUniqueArray = theArray.unique(); // -> [37,36,35]

Редактировать: Я исправил вашу скрипку.У тебя была куча проблем.Взгляните здесь .

Несколько вещей:

  • Вам не нужно добавлять <script> теги в jsFiddle
  • Youне нужно добавлять $(document).ready(...) вокруг вашего кода в jsFiddle.
  • Поскольку Array.prototype.unique = function()... является выражением функции, оно не поднимается.Я переместил его выше вашего другого кода.
  • Вы выполняете цикл от нуля до длины currTaskIDs, которая является строкой, а не массивом.Таким образом, когда его значение равно 35,36, это пять итераций, а не две.Поскольку функция unique работает с массивами, я изменил строку на массив:

    if (currTaskIDs.length) arr = currTaskIDs.split(',');
    
  • Затем мы добавляем текущее выбранное значение в массив, если применимо:

    if (tid.length) arr.push(tid);
    
  • Наконец мы запускаем функцию unique, которая запустила все это упражнение, затем превращаем весь беспорядок обратно в строку и добавляем его в свое поле:

    var u = arr.unique();
    $("#taskIDList").val(u.join(','));
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...