String(x,y)到Object {x,y}

时间:2012-09-29 20:28:43

标签: javascript regex

"(5.035,1)"格式的PostgreSQL点转换为{x: 5.035, y: 1}的最有效方法是什么?

我在PHP中编写的函数类似于

function pointToArray($point) {
    if ( strlen($point) == 0 ) return null;

    $xy = explode(",", substr($point, 1, strlen($point)-2));

    return array(
        "x" => $xy[0], 
        "y" => $xy[1]
    );
}

4 个答案:

答案 0 :(得分:3)

您可以在Javascript中使用与PHP中相同的方法:

function pointToObject(point) {
  if(!point.length) return null;
  var split = point.slice(1, -1).split(",");
  return {
    x: +split[0],
    y: +split[1]
  };
}

我刚才做的一个天真的基准测试能够在1.53秒内执行此功能200万次。

而且,为了更好的衡量,这是一个正则表达式解决方案,无耻地从大多数浏览器上的marginally faster NullUserException中窃取

function conv(s) { 
   var rx = /\(([^,]+),\s*([^)]+)\)/g; 
   var m = rx.exec(s); 
   return (!m ? null : { x: +m[1], y: +m[2]}); 
}

答案 1 :(得分:1)

假设问题中的 point 表示地理点,可以使用ST_XST_Y提取数字。然后可以使用Postgres的字符串连接重新组合这些值(如果使用当前版本,则使用其JSON函数)。

在SQL中进行转换可能比使用PHP的PHP更快,更可靠。

答案 2 :(得分:1)

这可以避免为拆分创建字符串数组的开销:

function pointToObject(point) {
   var i = point.indexOf(",");
   if(i==-1) return null;
   return {
     x: point.substr(1, i-1),
     y: point.substr(i+1, point.length-i-2)
   }
}

答案 3 :(得分:0)

这很简短,但很讨厌,利用了(x, y)有点看起来像参数列表的事实:

function c(x, y) {
    return {x:x, y:y};
};

p = "(5.035, 1)";
a = eval("c" + p);