2

I have the following string: area = "73,159,160,178,165,340,70,382"; And I need to convert it to the following format:

area = [
{
"x": 73,
"y": 159,
},
{
"x": 160,
"y": 178,
},
{
"x": 165,
"y": 340,
},
{
"x": 70,
"y": 382,
}
]

I can start by converting it to a normal array:

JSON.parse("[" + area + "]")

But I'm now stuck on how to make the nested objects. How would I now know what is every other odd and even number and allocate it to the corresponding object?

Andrew Howard
  • 2,818
  • 5
  • 33
  • 59
  • 1
    You may try with `reduce` method. Maybe [this answer](https://stackoverflow.com/a/62880863/7808889) would be helpful? – btlm Oct 28 '21 at 14:37

4 Answers4

3

You can split the string by a comma and use a for loop to loop through the resulting array and construct the objects:

const str = "73,159,160,178,165,340,70,382"

const split = str.split(",")
const arr = []

for(let i = 0; i < split.length; i++){
  arr.push({"x":split[i], "y":split[++i]})
}

console.log(arr)
Spectric
  • 30,714
  • 6
  • 20
  • 43
1

I believe this is what you are trying to achieve? please note that I didn't add a code to check if the number of item In the array will be even or not, so if your newArea is odd this function will fail

function Convert(arrayOfArea){
    let Converted = [];
  let count = arrayOfArea.length/2;
  let mod = arrayOfArea.length%2;
  
  for(let i = 0; i < count; i++){
    Converted.push({x:0 , y:0});
    Converted[i].x = arrayOfArea[i]
    Converted[i].y = arrayOfArea[i+1];
  }
  return Converted;
}

let strArea = "73,159,160,178,165,340,70,382";
let newArea = JSON.parse("["+strArea+"]");
console.log(Convert(newArea));
Vaness
  • 11
  • 2
1

Here's another way of approaching this using String.split() and Array.reduce().

We use String.split to split the area string into an array, then use reduce to turn into the desired result. The + shorthand is simply converting the string coordinates to numbers.

const area = "73,159,160,178,165,340,70,382";
const result = area.split(',').reduce((acc, s, i, a) => [...acc, ...((i % 2) ? [{ x: +a[i-1], y: +s}] : []) ], []);
console.log(result)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Terry Lennox
  • 29,471
  • 5
  • 28
  • 40
1

Here is an alternative using regex

let area = "73,159,160,178,165,340,70,382"

let regex = /\d+,\d+/g

match = area.match(regex).map(match => {
  let [x, y] = match.split(",")
  return {x, y}
})

console.log(match)
Henok Teklu
  • 528
  • 3
  • 9