将"(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]
);
}
答案 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_X
和ST_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);