2010-09-22 6 views
0

Я пытаюсь создать уникальный список taskID, основанный на выборе. В каждой задаче могут быть не более двух компаний. Моя проблема заключается в том, что сравнение 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 TextBox дисплеев 35. < прохода>
  2. я выбрать две компании для задачи 36, taskIdList TextBox отображает: 36,36 , 35 < fail> Должно отображаться 36, 35.
  3. Я выбираю одну компанию для задачи 37, taskIdList правильно добавляет 37 к списку. Затем я меняю компанию, тогда taskIdList становится 37,37,36,36,35: < fail>

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

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

ответ

1

Глядя на это как проблему простого удаления дубликатов из окончательного списка, вы можете написать небольшую функцию, как показано в this SO answer. Оставляя в стороне любой concerns with modifying objects you don't own добавить эту функцию (и тот факт, что это O (N^2)), функция позволяет сделать это:

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

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

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

  • Вам не нужно, чтобы добавить теги <script> в jsFiddle
  • Вам не нужно добавлять $(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(',')); 
    
+0

Я добавил $ ("# taskIDList"). Val (jQuery.unique (arr3)); но это не сработает. если я выбираю первую и вторую компанию из задачи 36, мой список становится 36,36,35 – CFNinja

+0

Функция 'unique' не встроена. Вы должны добавить функцию, как показано в ответе, который я связал выше. Это * не * 'jQuery.unique() ', который работает только с элементами DOM. Вы попробовали это? –

+0

добавил Array.prototype.unique и называется arr3 = arr.concat (arr2) .unique(); но я все еще не могу понять. – CFNinja

Смежные вопросы