Andrew Howard
Andrew Howard

Reputation: 3072

Convert string of co-ordinates to nested objects x and y

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?

Upvotes: 2

Views: 91

Answers (4)

Henok Teklu
Henok Teklu

Reputation: 538

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)

Upvotes: 1

Terry Lennox
Terry Lennox

Reputation: 30675

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; }

Upvotes: 1

Vaness
Vaness

Reputation: 11

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));

Upvotes: 1

Spectric
Spectric

Reputation: 31987

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)

Upvotes: 3

Related Questions