1
\$\begingroup\$

I've never formally learned javascript, and I feel very much like I'm unaware of 'good' practice.

I'm working on this open source project, and in particular the code that converts the incoming JSON into a usable data structure in this file

The relevent function looks like this:

   function start() {
       key = "toppage";
       utterances = {};
       links = {};
       colours = {};
       icons = {};
       labels = {};
       slide_number = {};
       var req = new XMLHttpRequest();
       req.open("GET", "pageset.json");
       req.overrideMimeType("application/json");
       req.send(null);
       req.onreadystatechange = function() {
           if (req.readyState == 4 && req.status == 200) {
               var obj = JSON.parse(req.responseText);
               for (grid in obj.Grid) {
           console.log(obj.Grid[grid][0])
                   labels[obj.Grid[grid][0]] = obj.Grid[grid][1];
                   utterances[obj.Grid[grid][0]] = obj.Grid[grid][2];
                   links[obj.Grid[grid][0]] = obj.Grid[grid][3];
                   icons[obj.Grid[grid][0]] = obj.Grid[grid][4];
                   colours[obj.Grid[grid][0]] = obj.Grid[grid][5];
                   slide_number[obj.Grid[grid][0]] = obj.Grid[grid][6];
           if(obj.Grid[grid][6]==0){
            key=obj.Grid[grid][0]
            }
               }
               grid_size_rows = obj.Settings[0];
               grid_size_columns = obj.Settings[0];
               setup_messagewindow();
               setup_table();
               load_page(key);
           }
       };
       //TODO - needs an error message if the JSON doesn't load
   }

I have NO idea if this is a reasonable way to populate structures in javascript. It works, but I feel like it could be a hell of a lot more elegant. Any comments people have would be welcome.

\$\endgroup\$
1
  • \$\begingroup\$ Could you add a document from the response you're receiving? Also, this is not a complete code. Functions setup_*() are missing. CodeReview does not allow posting partial code with links to GitHub. \$\endgroup\$ Commented Dec 27, 2017 at 22:09

2 Answers 2

1
\$\begingroup\$

First of all,you declare them without anything,so it's probably declared globally,this is not good,with this amount of variables in global.

Second of all,ES6 Destructuring assignment

var arr=[1,2,3,4,5];
var [a,b,c,d,e]=arr;
console.log(a,b,c,d,e); // 1,2,3,4,5

Using the same way,

for (grid in obj.Grid) {
    var i=obj.Grid[grid][0];
    var [unused,labels[i], utterances[i], links[i], icons[i], colours[i], slide_number[i]]
    =obj.Grid[grid]
    //....
}
\$\endgroup\$
0
\$\begingroup\$
  • Declare variables with let (if it gets reassigned) or const (if it never gets reassigned).
    I would recommend against using var nowadays. There are no use cases I know of where it is better than let.

    As far as I can see, all variables in your posted code can be declared const.

  • Do not use for (const entry in obj) pattern for iterating keys. You use it here: for (grid in obj.Grid).

    Modern alternatives:

    for (const [key, value] of Object.entries(obj)) {
      // ...
    }
    
    for (const key of Object.keys(obj)) {
      const value = obj[key]
      // ...
    }
    
  • Use === for comparison, e.g. req.status === 200

  • You could use the newer Fetch API as a replacement for XMLHttpRequest. In my opinion, this is worthwhile just for the Promise-driven code you get for free. For example, your //TODO - needs an error message if the JSON doesn't load can be expressed as .catch(err => /* error handling */) (note that fat arrow function syntax).

  • Extract "pageset.json" into a constant: const ASSET_JSON_ENDPOINT = "pageset.json" and put it at the beginning of the function or even outside of the function in the outer scope of your

    • file or
    • module (ES6+ terminology) or
    • your Immediately-Invoked Function Expression (IIFE)


    Generally, I would recommend using modules (with import ... from ... and export ... syntax). They supersede IIFEs.

    Also choose a better name than "asset" depending on the kind of data you're loading.

  • Properly indent/auto-format your code.

\$\endgroup\$

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.