Home > Software design >  print out JSON objects based on level
print out JSON objects based on level

Time:01-10

I want to print out JSON list formatted by level. What I have is a JSON of objects. Each object has a level eg 0, 1, 2. 0 being the uppermost and 2 being the innermost level. I want to print out the list with a indentation to each inner level

So a list would look like this

0
    1
    1
         2
         2

What my code looks like:

for (let category of json.categories) {
  if ((category.level = 0)) {
    console.log(
      category.category   "https://www.example.com/"   category.seo_name
    );
  }

  else if ((category.level = 1)) {
    console.log(
      "   "  
        category.category  
        " "  
        "https://www.example.com/"  
        category.seo_name
    );
  }

 else if ((category.level = 2)) {
    console.log(
      "     "  
        category.category  
        " "  
        "https://www.example.com/"  
        category.seo_name
    );
  }
}

This does look clunky and even worse, it doesn't work and there is no indentation.

CodePudding user response:

How about using PRE and use the level to space it like suggested in a comment

const data = [{ level: 0 }, { level: 1 }, { level: 1 }, { level: 2 }, { level: 2 }];
const container = document.querySelector('pre');
container.innerHTML = data
  .map(({level}) => `${String(level).padStart(level 1,"\t")}`)
  .join("\n")
<pre></pre>

CodePudding user response:

You are assigning value inside your if condition using = instead of ==. Also, a much cleaner way is by using switch instead of if (atlease in this case and in my opinion), and use some loop so that you can easily change the number of spaces you can leave in your indentation anytime instead of counting it manually as you have in your code.

var data = [{ level: 0 }, { level: 1 }, { level: 1 }, { level: 2 }, { level: 2 }];

for (let element of data) {
  let result = "";
  switch (element.level) {
    case 1:
      for (let index = 0; index < 4; index  )
        result  = " ";
      result  = element.level;
      break;
    case 2:
      for (let index = 0; index < 8; index  )
        result  = " ";
      result  = element.level;
      break;
    default:
      result  = element.level;
  }
  console.log(result)
}

CodePudding user response:

var data = [{ level: 0 }, { level: 1 }, { level: 1 }, { level: 2 }, { level: 2 }];

for (let obj of data) {
  let result = "";
  result = ' '.repeat(obj.level * 4)   obj.level;
  console.log(result)
}

If you want one line.

var data = [{ level: 0 }, { level: 1 }, { level: 1 }, { level: 2 }, { level: 2 }];

data.forEach(obj => console.log(' '.repeat(obj.level * 4)   obj.level))

  •  Tags:  
  • Related