Разделение массива

#javascript #jquery #arrays

#javascript #jquery #массивы

Вопрос:

У меня есть две функции javascript, первая работает, вторая работает, но не отображает правильное значение в скрытых входных данных.

Мне удалось получить правильное последнее скрытое входное значение, но я не уверен, как

 var customTicketsArr = Array();

function EditEventAddTicket(){
    alertWrongTime = false;
    var TicketName = jQuery("#ticketname").val();
    var TicketPrice = jQuery("#ticketprice").val();
    var ticketquantity = jQuery("#ticketquantity").val();

    var storeString = "TicketName"   TicketName   "TicketPrice"   TicketPrice   "Quantity"   ticketquantity   '';
    customTicketsArr.push(storeString);
    EditEventUpdateTickets(true);
}


function EditEventUpdateTickets(fade){
   jQuery("#custom_tickets_string").val(customTicketsArr);
   var output = "";
   var style = "";
   for (i = customTicketsArr.length-1; i >= 0; i--){
       ticketname = customTicketsArr[i].split("TicketName");

           ticketprice = customTicketsArr[i].split("TicketPrice");

           ticketquantity = customTicketsArr[i].split("Quantity");
       if(fade){
           if (customTicketsArr.length - 1 == i){
               style = "display: none; ";
               var fadeInDiv = i;
           } else {
               style = "";
           }
       }
       if (i % 2 == 1) { style  = "background-color: #660000; "}
       html = "<div id='customticket"   i   "' class='customeventbase' style='"   style   "'>";
       html  = '<input type="hidden" name="customTicketid['   i   '][Name]" id="customticketName'   i   '" value="'  ticketname    '" />';
           html  = '<input type="hidden" name="customTicketid['   i   '][Price]" id="customticketPrice'   i   '" value="'  ticketprice[1]   '" />';
           html  = '<input type="hidden" name="customTicketid['   i   '][Quantity]" id="customticketQuantity'   i   '" value="'  ticketquantity[1]   '" />';

       html  = '<button class="customeventdel" type="button"  onClick="EditEventRemoveDate('   i   ')"></button>';
       html  = '<div class="clear"></div>';
       html  = '</div>n';

       output  = html;
   }
   output  = "<input type='hidden' id='custom_ticket_info' name='custom_ticket_info' value='"   customTicketsArr   "' />";
   jQuery("#custom_ticket_container").html(output);
   if(fade){
      setTimeout("EditEventfadeInDiv("   fadeInDiv  ")", 10);
   }

}
  

это выводит:

     <div style="background-color: #660000; " class="customeventbase" id="customticket1">
<input type="hidden" value=",testTicketPrice50Quantity44" id="customticketName1" name="customTicketid[1][Name]">
<input type="hidden" value="undefined" id="customticketPrice1" name="customTicketid[1][Price]">
<input type="hidden" value="44" id="customticketQuantity1" name="customTicketid[1][Quantity]">
<button onclick="EditEventRemoveDate(1)" type="button" class="customeventdel"></button>
<div class="clear"></div></div>
  

значения для первых двух скрытых полей неверны

Комментарии:

1. Оставляя код в стороне, можете ли вы объяснить, чего вы пытаетесь достичь?

Ответ №1:

Это не неправильные значения — split() делает именно то, что и должно — возвращает массив подстрок после удаления разделителя.

В вашей строковой структуре разделение на TicketName даст вам две строки — подстроку перед разделителем и подстроку после — TicketName сама по себе не включена.

Таким образом, для строки "TicketNametestTicketPrice50Quantity44" вы получите "" и "testTicketPrice50Quantity44" при разделении на "TicketName" . Разделение одной и той же строки на TicketPrice даст вам "TicketNametest" и "50Quantity44" .

Я бы предложил вместо этого поместить объекты в ваш массив —

 var storeObject = {
                    "TicketName" : TicketName,
                    "TicketPrice" : TicketPrice, 
                    "Quantity" : ticketquantity
                  };
customTicketsArr.push(storeObject);
  

Затем вы можете получить обратно данные в виде:

 for (i = customTicketsArr.length-1; i >= 0; i--){
    var currentObject = customTicketsArr[i];

    var ticketname = currentObject.TicketName;
    var ticketprice = currentObject.TicketPrice;
    var ticketquantity = currentObject.Quantity;

    //do other stuff here
}
  

Ответ №2:

почему вы сохраняете это как строку? Я бы рекомендовал сохранить его в объекте:

 function EditEventAddTicket(){
    alertWrongTime = false;
    var TicketName = jQuery("#ticketname").val();
    var TicketPrice = jQuery("#ticketprice").val();
    var ticketquantity = jQuery("#ticketquantity").val();

    var ticket = {"TicketName": TicketName, "TicketPrice": TicketPrice, "Quantity": ticketquantity};
    customTicketsArr.push(ticket);
    EditEventUpdateTickets(true);
}
  

и затем вы можете просто загрузить данные:

 for (i = customTicketsArr.length-1; i >= 0; i--){
       ticketname = customTicketsArr[i].TicketName;
       ticketprice = customTicketsArr[i].TicketPrice;
       ticketquantity = customTicketsArr[i].Quantity;

       // ...
}
  

Ответ №3:

Почему бы просто не создать двумерный массив?

 var customTicketsArr = Array();

function EditEventAddTicket() {
    customTicketsArr.push({
        'name'  : jQuery("#ticketname").val(),
        'price' : jQuery("#ticketprice").val(),
        'qty'   : jQuery("#ticketquantity").val()
    });
}