3

i have this code:

    $(".link").each(function() {
            group += 1;
            text += 1;
            var links = [];
            links[group] = [];

            links[group][text] = $(this).val();
        }
    });

    var jsonLinks = $.toJSON(links);

after it has looped every .link it will exit the each loop and encode the array 'links' to json. but the array 'links' is a local variable inside the each-loop. how can i make it global outside the loop?

2

6 Answers 6

9

Define links outside the loop:

var links = [];
$(".link").each(function() {
  group += 1;
  text += 1;
  links[group] = [];
  links[group][text] = $(this).val();
});
var jsonLinks = $.toJSON(links);

I should also point out that this doesn't make a lot of sense because you will end up element 7, for example, being an array with a single element (indexed as 7) to the value. Is this really what you want?

What I imagine you want is an array of the values. If so, why not use map()?

var links = $(".link").map(function(i, val) {
  return $(val).val();
});
Sign up to request clarification or add additional context in comments.

2 Comments

i dont quite understand the map function. ive read the documentation, but still dont get it. could u explain what is happening? what is 'i' and 'val'? and what does return mean?
map() applies a function to every element of an array. So the function is called for each element. Whatever the function returns is in the result array. The arguments to the callback are i (the number match starting from 0) and val (the array element, which is also this).
2

.

var links = [];

$(".link").each(function() {
        group += 1;
        text += 1;            
        links[group] = [];

        links[group][text] = $(this).val();
    }
});

var jsonLinks = $.toJSON(links);

Comments

2

Just declare it before your block of code:

var links = [];
$(".link").each(function() {
        group += 1;
        text += 1;
        links[group] = [];
        links[group][text] = $(this).val();
    }
});

var jsonLinks = $.toJSON(links);

or simply remove 'var':

$(".link").each(function() {
        group += 1;
        text += 1;
        links = [];
        links[group] = [];
        links[group][text] = $(this).val();
    }
});

var jsonLinks = $.toJSON(links);

Comments

2

Create a closure:

{    
    var links = [];
    $(".link").each(function() {
            group += 1;
            text += 1;

            links[group] = [];

            links[group][text] = $(this).val();
        }
    });

    var jsonLinks = $.toJSON(links);
}

Comments

0

To define a global variable, you can either

a) define the variable outside of a function (as already mentioned in other answers)

or

b) attache the variable to the window object


$(".link").each(function() {
            group += 1;
            text += 1;
            window.links = [];
            links[group] = [];

            links[group][text] = $(this).val();
        }
    });

    var jsonLinks = $.toJSON(links);

or

c) create a variable without the var keyword


$(".link").each(function() {
            group += 1;
            text += 1;
            links = [];
            links[group] = [];

            links[group][text] = $(this).val();
        }
    });

    var jsonLinks = $.toJSON(links);

Comments

0

JavaScript only understand two scopes

  1. Global: Which is any variable outside the function and variables declare without the var

  2. Function : Anything which is inside the function.

So i will suggest you the closure approach as follows

 function getJSONLinks()
 {
      var links = [];
      $(".link").each(function() {
        group += 1;
        text += 1;
        links[group] = [];
        links[group][text] = $(this).val();
       }
     });
     return $.toJSON(links);
 }

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.