0

I have some problem with my JavaScript

<html>
<body>
<p id="demo2"></p>
<script>
     var text = '{"h":["username","hair_color","height"],"d":[["ali","brown",1.2],["ma0072c","blue",1.4],["joe","brown",1.7],["zehua","black",1.8]]}';

     var obj = JSON.parse(text);
     var x= Object.keys(obj.h).length;
     var y= Object.keys(obj.d).length;

     var json_datas = JSON.stringify(obj.h);
     var json_data = JSON.stringify(obj.d);
     var obj2 = JSON.parse(json_data);
     var json_data2 = JSON.stringify(obj2[1]);
     var obj3 = JSON.parse(json_data2);
     var newjson = [];
     var newjson2 = [];
     i=0;
     l=0;
     z=0;
     m=0;
     var boys= {};
     for (i in obj.h){      
         boys[obj.h[i]] = obj.d[m][l];
         l++;
         z++;
         m++;
         newjson.push(boys);
     }
     newjson2 = newjson2.concat(newjson);
     var newjson2 = JSON.stringify(newjson);
     document.getElementById("demo2").innerHTML = newjson2; 
</script>
</body>
</html>

this script boys[obj.h[i]] = obj.d[m][l];

why the code doesn't want to loop? Can someone tell me the correct loop? I want the output like this

[{"username":"ali","hair_color":"brown","height":1.2},
 {"username":"marc","hair_color":"blue","height":1.4},
 {"username":"joe","hair_color":"brown","height":1.7},
 {"username":"zehua","hair_color":"black","height":1.8}]

but my output right now is like this

[{"username":"ali","hair_color":"brown","height":1.2},
 {"username":"ali","hair_color":"brown","height":1.2},
 {"username":"ali","hair_color":"brown","height":1.2},
 {"username":"ali","hair_color":"brown","height":1.2}]
3
  • @nishant ,well spotted Commented Dec 24, 2015 at 12:07
  • 3
    And don't use for ..in loops on arrays Commented Dec 24, 2015 at 12:08
  • 1
    @Nishant you don't need i++ in a for-in loop Commented Dec 24, 2015 at 12:27

3 Answers 3

3

I'd suggest to improve the loop code to something like this:

var newjson2 = [];
obj.d.forEach(function(element) {
  var k = {};
  element.forEach(function(element, i){
    k[obj.h[i]] = element;
  })
  newjson2.push(k);
})

Looks clearer and more robust for me...

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

Comments

0

for (a in b) loops just iterates over object properties. To iterate over array elements use the forEach loop.

obj.h.forEach(function(element, idx, arr){
   boys[arr[element]] = obj.d[m][l];
   l++;
   z++;
   m++;
   newjson.push(boys);
});

Being the variable arr a reference to obj.h.

Comments

0

I don't know why you used a lot of code for getting this result. You can use this code:

<html>
<body>
 <p id="demo2"></p>
 <script>
   var text = '{"h":["username","hair_color","height"],"d":[["ali","brown",1.2],["ma0072c","blue",1.4],["joe","brown",1.7],["zehua","black",1.8]]}';

   var obj = JSON.parse(text);
   var newjson = [];
   for (var i = 0 ; i < obj.d.length; i++){ 
    var boys= {};
    for(var j= 0; j < obj.h.length; j++) {
      boys[obj.h[j]] = obj.d[i][j];    
    }
    newjson.push(boys);
   }
  document.getElementById("demo2").innerHTML = JSON.stringify(newjson);
</script>

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.