1

I need help building an array in JQuery.

I want to get the component name and each field inside of it. The HTML is this:

<div class="form-group _components" data-component="generic" id="module-bb3a969f-9029-5b86-8ac0-72180106df93">
    <label for="dynamic_text2">Text Field</label>
    <input type="text" class="form-control _content" data-id="module-bb3a969f-9029-5b86-8ac0-72180106df93"
        name="dynamic_text" value="">
    <input type="text" class="form-control _content" data-id="module-bb3a969f-9029-5b86-8ac0-72180106df93"
        name="dynamic_text2" value="">
</div>
<div class="form-group _components" data-component="generic" id="module-bb3a969f-9029-5b86-8ac0-72180106df93">
    <label for="dynamic_text">Text Field</label>
    <input type="text" class="form-control _content" data-id="module-bb3a969f-9029-5b86-8ac0-72180106df93"
        name="dynamic_text2" value="">
    <input type="text" class="form-control _content" data-id="module-bb3a969f-9029-5b86-8ac0-72180106df93"
        name="dynamic_text2" value="">
</div>

Javascript is:

        let _components = $('div._components');
        let dc = {};

        let dcString;
        let inputArray = [];
        let component = [];
        let input = {};
        _components.each(function () {
            let _input = $(this).children('input');
            console.log(_components.length);

            dc["id"] = $(this).attr('id');
            dc["component"] = $(this).attr('data-component');
            let input = {};
            _input.each(function () {

                if ($(this).attr('data-id') === $(this).parent().attr('id')) {
                    input["type"] = $(this).attr('type');
                    input["name"] = $(this).attr('name');
                    input["value"] = $(this).val();
                    inputArray.push(input);
                    dc["content"] = inputArray;
                } 

            });

            component.push(dc);
        });

My output is:

0:
component: "generic"
content: Array(4)
0: {name: "dynamic_text", type: "text", value: "asdfasd"}
1: {name: "dynamic_text2", type: "text", value: "fasdfasdfasdfadsf"}
2: {name: "dynamic_text", type: "text", value: "fasdfa"}
3: {name: "dynamic_text2", type: "text", value: "sdfasdfafafd"}
length: 4
__proto__: Array(0)
id: "module-bb3a969f-9029-5b86-8ac0-72180106df93"
__proto__: Object
1:
component: "generic"
content: Array(4)
0: {name: "dynamic_text", type: "text", value: "asdfasd"}
1: {name: "dynamic_text2", type: "text", value: "fasdfasdfasdfadsf"}
2: {name: "dynamic_text", type: "text", value: "fasdfa"}
3: {name: "dynamic_text2", type: "text", value: "sdfasdfafafd"}
length: 4
__proto__: Array(0)
id: "module-bb3a969f-9029-5b86-8ac0-72180106df93"

Which is not what I am looking for as it adds fields that don't belong to the component.

How can I build this array adding just the content fields of the specific component? Thanks

1
  • Thanks @freedomn-m, but I still get the same result moving let input = {}; inside the _input.each loop Commented Jun 2, 2020 at 15:41

1 Answer 1

1

You only (ever) have one inputArray so each time you

inputArray.push(input) 

you're adding to the same inputArray - and dc["content"] points to that one array (you don't get a copy with dc["content"] = inputArray, it points to the same array) - so all of your dc.content point to the same array and all have 4 entries.

In general, keep all the let= to the narrowest scope, in this case, move let inputArray=[] (new array) inside the _components.each

_components.each(function() {
  let _input = $(this).children('input');
  let inputArray = [];

Updated fiddle: https://jsfiddle.net/rny4op0x/

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

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.