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}]
EJW
3383 gold badges7 silver badges18 bronze badges
asked Dec 24, 2015 at 12:02
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...

answered Dec 24, 2015 at 12:16
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.

answered Dec 24, 2015 at 13:26

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>
Oriol
291k71 gold badges459 silver badges535 bronze badges
answered Dec 24, 2015 at 12:33

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

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.