Home > OS >  [circular object Object]] in for loop javascript
[circular object Object]] in for loop javascript

Time:11-28

I'm trying to loop through the data and get it to produce

[
{
  odds: "2/3",
  position: 1,
  terms: "1/5"
},
{
  odds: "4/1",
  position: 1,
  terms: "1/7"
}
]
<script>
    var res = '{"count":"2","bettype":"double","position[0]":"1","oddsa[0]":"2","oddsb[0]":"3","placeodds[0]":"1/5","position[1]":"1","oddsa[1]":"4","oddsb[1]":"6","placeodds[1]":"1/7"}';

var line = {};
//
var getvals = JSON.parse(res);
var count = parseInt(getvals["count"]);

var i = 0;
const array = [];//new Array();
for(var i = 0;i < count;i  )
{
line["odds"] = getvals["oddsa[" i "]"] '/' getvals["oddsb[" i "]"];
line["terms"] = getvals["placeodds[" i "]"];
line["position"] = getvals["position[" i "]"];
array.push(line);
}
console.log(array);
  </script>

However this is the result I get from the above

[{
  odds: "4/6",
  position: "1",
  terms: "1/7"
}, [circular object Object]]

I'm not a JS coder so trying to learn as I go however I've looked at a few other examples but I'm still having issues

CodePudding user response:

You need to create a new line object every iteration of the loop. Otherwise you are modifying and pushing the same object reference over and over to the array

var res = '{"count":"2","bettype":"double","position[0]":"1","oddsa[0]":"2","oddsb[0]":"3","placeodds[0]":"1/5","position[1]":"1","oddsa[1]":"4","oddsb[1]":"6","placeodds[1]":"1/7"}';


//
var getvals = JSON.parse(res);
var count = parseInt(getvals["count"]);

var i = 0;
const array = []; //new Array();
for (var i = 0; i < count; i  ) {
  // create new object here
  var line = {};
  line["odds"] = getvals["oddsa["   i   "]"]   '/'   getvals["oddsb["   i   "]"];
  line["terms"] = getvals["placeodds["   i   "]"];
  line["position"] = getvals["position["   i   "]"];
  array.push(line);
}
console.log(array);
<iframe name="sif1" sandbox="allow-forms allow-modals allow-scripts" frameborder="0"></iframe>

CodePudding user response:

In the second "what do you want" object you don't get 4/1 with the logic you used because oddssa[1] is 4 and oddsb[1] is 6 so you'll get 4/6

The logic itself looks promising keep it up! But as soon as I specified an object inside loop I got the result you specified.

I also cleaned up, and added the template literals (backticks) so you wouldn't be so confused with the pluses to concat the strings, added a proper variable declaration (instead of var, use const/let standard) and changed to calling property getvals.count because I would only use the form getvals[string] if the property name is actually a number or dash.

const res = '{"count":"2","bettype":"double","position[0]":"1","oddsa[0]":"2","oddsb[0]":"3","placeodds[0]":"1/5","position[1]":"1","oddsa[1]":"4","oddsb[1]":"6","placeodds[1]":"1/7"}';

const getvals = JSON.parse(res);

const count = parseInt(getvals.count);

const arr = [];

for(let i = 0;i < count;i  ) {
  const line = {
    odds: getvals[`oddsa[${i}]`]   "/"   getvals[`oddsb[${i}]`],
    terms: getvals[`placeodds[${i}]`],
    position: getvals[`position[${i}]`]
  }
  arr.push(line)
}

console.log(arr)
  • Related