1

I have a form with dynamic input. Inputs have same name attributes. So I want to make array for each row.

Like this;

[{'company':'Apple'},{'address':'USA'}],
[{'company':'Samsung'},{'address':'Korea'}]

I am using this simple form (it's dynamic);

<form id='companies'>
  <input name='company[]'>
  <input name='address[]'>
</form>

And this;

$('form').submit(function(event) {
   var newFormData = $('#companies').serializeArray();
      console.log(newFormData);
   event.preventDefault();
 });

Console Log; (All inputs in same array)

[{'company':'Apple'},{'address':'USA'},{'company':'Samsung'},{'address':'Korea'}]
4
  • Your expected output is invalid. You should have key:value inside object {}. But you are treating the object like its array. Or i think you mistyped , it should be : like {'company':'Apple'} Commented Apr 9, 2019 at 1:43
  • Hi Maheer, Please tell me how it should be. This is a practice for me I'm newbie :) And yes wrong syntax. Fixed. Commented Apr 9, 2019 at 1:46
  • 2
    I think you can have a an array of objects. For each row you should use a single object. [{'company':'Apple','address':'USA'},{'company':'Samsung','address':'Korea'}] ` Commented Apr 9, 2019 at 1:57
  • 1
    The data structure you say you want isn't very useful. Can you provide us with a reason for that requirement? Commented Apr 9, 2019 at 2:25

2 Answers 2

1

This is an example of solution of your problem :)

<form id='companies'>
  <div class='container-input'> 
     <input name='company[]'>
     <input name='address[]'>
  </div>
  <div class='container-input'> 
     <input name='company[]'>
     <input name='address[]'>
  </div>
  ... -> Now you have dynamic containers
</form>

You could use this approach to solve the problem with jQuery.

$('#companies').submit(function(event) {
    var $data = [];

    var $containers = $(".container-input");

    $containers.each(function() {
        var $contenedor = $(this);
        var $inputCompany = $contenedor.find('input[name^="company"]');
        var $inputAddress = $contenedor.find('input[name^="address"]');

        var $objectInput = [{
            'company': $inputCompany.val()
        }, {
            'address': $inputAddress.val()
        }];

        $data.push($objectInput);

    });

    console.log($data);

});
Sign up to request clarification or add additional context in comments.

1 Comment

Hey Pepe thank you for answer but console log is like this. [{'company':'Apple','address':'USA'},{'company':'Samsung','address':'Korea'}] . I want each dynamic input group to get separate array.
0

May help :) more dynamically.

$('#companies').submit(function(event) {
    var $data = [];
    $.each($(this).children("div"),function(){
      obj={};
      $.each($(this).find(":input"),function(){
         obj[$(this).attr("name").replace("[]","")]=$(this).val();
         $data.push(obj);
      });
    })
    console.log($data);
    event.preventDefault();
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form id='companies'>
  <div class="input">
    <input name='company[]'>
    <input name='address[]'>
    <input name='phone[]'>
  </div>
  <div class="input">
    <input name='company[]'>
    <input name='address[]'>
  </div>
  <div class="input">
    <input name='company[]'>
    <input name='address[]'>
  </div>
  <input type="submit"/>
</form>

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.