DevWizard
DevWizard

Reputation: 697

Javascript array remove odd commas

I need to create a string like this to make works the mapserver request:

filterobj = "POLYGON((507343.9 182730.8, 507560.2 182725.19999999998, 507568.60000000003 182541.1, 507307.5 182563.5, 507343.9 182730.8))";

Where the numbers are map coordinates x y of a polygon, the problem is with Javascript and OpenLayer what I have back is an array of numbers, How can I remove just the ODD commas (first, third, fifth...)?

At the moment I've created the string in this way:

filterobj = "POLYGON((" +  
Dsource.getFeatures()[0].getGeometry().getCoordinates() + " ))";

And the result is:

POLYGON((507343.9, 182730.8,507560.2, 182725.19999999998, 507568.60000000003, 182541.1, 507307.5, 182563.5,507343.9, 182730.8));

It's almost what I need but, I need to remove the ODD commas from the Dsource.getFeatures()[0].getGeometry().getCoordinates() array to make the request work, how can I do that?

Upvotes: 1

Views: 362

Answers (5)

Monty Dawson
Monty Dawson

Reputation: 54

The format that you need is WKT, and OpenLayers comes with a class that allows you to parse its geometries as WKT easily, as below:

var wktFormatter = new ol.format.WKT();
var formatted = wktFormatter.writeFeature(Dsource.getFeatures()[0]);
console.log(formatted); // POLYGON((1189894.0370893013 -2887048.988883849,3851097.783993299...

Upvotes: 2

Nikola Lukic
Nikola Lukic

Reputation: 4248

Look at code snippet :

Help method : setCharAt , Take all commas , take all odds commas with i % 2 == 0

// I need to start from somewhere
function setCharAt(str,index,chr) {
    if(index > str.length-1) return str;
    return str.substr(0,index) + chr + str.substr(index+1);
}

var POLYGON = [507343.9, 182730.8,507560.2, 182725.19999999998, 507568.60000000003, 182541.1, 507307.5, 182563.5,507343.9, 182730.8];

var REZ = "";
REZ = POLYGON.toString();

var all_comma = [];

for(var i=0; i<REZ.length;i++) {
  if (REZ[i] === ",") all_comma.push(i);
}

for(var i=0; i<all_comma.length;i++) {
  if (i % 2 == 0 ) {
    REZ = setCharAt(REZ,all_comma[i],' ');
  }    
}

console.log(REZ);

// let return nee element intro POLYGON

// reset
POLYGON = REZ.split(',');

console.log(POLYGON);

Upvotes: 0

vgru
vgru

Reputation: 51322

One approach would be using Array.reduce():

var input = '1.0, 2.0, 3.0, 4.0, 5.0, 6.0';

var output = input
  .split(',')
  .reduce((arr, num, idx) => { 
     arr.push(idx % 2 ? arr.pop() + ' ' + num : num);
     return arr;
   }, [])
  .join(',');

// output = '1.0 2.0, 3.0 4.0, 5.0 6.0'

Upvotes: 0

RobG
RobG

Reputation: 147553

There are a couple of ways to go, both involve getting rid of whitespace first. The first matches coordinate pairs, removes the comma, then pastes them back together.

The second splits into individual numbers, then formats them with reduce. Both should be ECMA-262 ed5 (2011) compatible but I don't have an old enough browser to test them.

var s = '507343.9, 182730.8,507560.2, 182725.19999999998, 507568.60000000003, 182541.1, 507307.5, 182563.5,507343.9, 182730.8';
var re = /\d+\.?\d*,\d+\.?\d*/g;
  
// Solution 1
var x = s.replace(/\s/g,'').match(re).map(function(x){return x.replace(',',' ')}).join();
console.log(x);

// Solution 2
var t = s.replace(/\s/g,'').split(',').reduce(function (acc, v, i) {
  i%2? (acc[acc.length - 1] += ' ' + v) : acc.push(v);
  return acc;
}, []).join(',');

console.log(t);

Upvotes: 0

ema
ema

Reputation: 5783

What about this:

const str = Dsource.getFeatures()[0].getGeometry().getCoordinates()
// str = "1,2,3,4,5,6"
str.split(',').map((v, i) => {
  return (i % 2) ? v : v + ',' 
}).join(' ')
// "1, 2 3, 4 5, 6"

Upvotes: 0

Related Questions