2016-01-14 4 views
1

У меня есть HTML формы, как:Получить данные формы в условном формате JSON

<form action="" id="my-form"> 
    <input type="text" name="id" value="1"/> 
    <input type="text" name="custom" value="a"/> 
    <input type="text" name="custom" value="b"/> 
    <input type="text" name="custom" value="c"> 
</form> 

Когда я получаю данные формы в формате JSON, он показывает, как:

{id: 1, custom: c} //get the last value only 

Мне нужно эти данные такой так, что:

  • если name="custom" существует только один раз в моей форме, JSON будет

    {id: 1, custom: c} // it is working now 
    
  • если name="custom" существует несколько раз в моей форме, JSON будет

    { 
    id: 1, 
    multiple:[ 
        {custom: a}, 
        {custom: b}, 
        ... 
        ] 
    } 
    

    ИЛИ

    {id: 1, custom:[a, b, c]} 
    

мой метод, чтобы получить JSon данных является:

function getFormData($form){ 
    var unindexed_array = $form.serializeArray(); 
    var indexed_array = {}; 
    $.map(unindexed_array, function(n, i){ 
    indexed_array[n['name']] = n['value']; 
    }); 
    return indexed_array; 
} 
var $form = $("#my-form"); 
var data = getFormData($form); 

Как решить эту проблему? Спасибо в продвинутом режиме.

+0

где ваш метод для преобразования данных формы JSON? – gurvinder372

+0

Моя первоначальная мысль использует имя = "custom []", который затем создает пользовательский массив: {id: 1, custom: ["a", "b", "c"]} – yusijs

+0

@gurvinder, мой метод : function getFormData ($ form) { var unindexed_array = $ form.serializeArray(); var indexed_array = {}; $ .map (unindexed_array, function (n, i) { indexed_array [n ['name']] = n ['value']; }); return indexed_array; } var $ form = $ ("# my-form"); var data = getFormData ($ form); –

ответ

0

здесь какое-то решение

<!DOCTYPE html> 
    <html> 
    <body> 
    <form action="" id="my-form"> 
     <input type="text" name="id" value="1"/> 
     <input type="text" name="custom" value="a"/> 
     <input type="text" name="custom" value="b"/> 
     <input type="text" name="custom" value="c"> 
    </form> 

    <script> 
     var objData = {}; 
     var tmpArray = []; 
     var allInputs = document.getElementById("my-form").elements; 
     for (var i = 0, len = allInputs.length; i < len; i++) { 
      var existInArray = false; 
      for (var j = 0, lenArr = tmpArray.length; j < lenArr; j++) { 
       if (tmpArray[j] == allInputs[i].getAttribute('name')) { 
        existInArray = true; 
       } 
      } 
      if (!existInArray) { 
       tmpArray.push(allInputs[i].getAttribute('name')); 
       objData[allInputs[i].getAttribute('name')] = allInputs[i].getAttribute('value'); 
      } else { 
       if (Object.prototype.toString.call(objData[allInputs[i].getAttribute('name')]) === '[object Array]') { 
        objData[allInputs[i].getAttribute('name')].push(allInputs[i].getAttribute('value')); 
       } else { 
        var tmpValue = objData[allInputs[i].getAttribute('name')]; 
        objData[allInputs[i].getAttribute('name')] = []; 
        objData[allInputs[i].getAttribute('name')].push(tmpValue); 
        objData[allInputs[i].getAttribute('name')].push(allInputs[i].getAttribute('value')) 
       } 
      } 
     } 
     alert(JSON.stringify(objData)); 

    </script> 
    </body> 
    </html> 

также в Plkr https://plnkr.co/edit/zEid9XRXQYfxNHrXTsxu?p=preview

И если вы хотите вставить ключ многократного использования этого после последнего еще

if(Object.prototype.toString.call(objData[allInputs[i].getAttribute('name')]) === '[object Array]') { 
    objData[allInputs[i].getAttribute('name')].multiple.push(allInputs[i].getAttribute('value')); 
} else { 
    var tmpValue = objData[allInputs[i].getAttribute('name')]; 
    objData[allInputs[i].getAttribute('name')] = { 'multiple' : []}; 
    objData[allInputs[i].getAttribute('name')].multiple.push(tmpValue); 
    objData[allInputs[i].getAttribute('name')].multiple.push(allInputs[i].getAttribute('value')) 
} 
+0

отличный помощник! –

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