1

"(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

4 に答える 4

3

PHP で行ったのと同じアプローチを Javascript でも使用できます。

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 万回実行できました。

そして、念のため、NullUserException から恥知らずに盗まれた正規表現ソリューションを次に示します。これは、ほとんどのブラウザーでわずかに高速です。

function conv(s) { 
   var rx = /\(([^,]+),\s*([^)]+)\)/g; 
   var m = rx.exec(s); 
   return (!m ? null : { x: +m[1], y: +m[2]}); 
}
于 2012-09-29T20:55:29.487 に答える
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)
   }
}
于 2012-09-29T21:20:23.860 に答える
1

問題のポイントが地理的なポイントを意味すると仮定すると、 とを使用ST_Xして数値を抽出できST_Yます。次に、Postgres の文字列連結を使用して (または、現在のバージョンを使用している場合は JSON 関数を使用して) 値を再結合できます。

SQL で変換を行う方が、JavaScript の PHP を目的に使用するよりもおそらく高速で信頼性が高くなります。

于 2012-09-29T21:02:35.297 に答える
0

(x, y)これは短いですが、パラメーターリストのように見えるという事実を利用して、厄介です。

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

p = "(5.035, 1)";
a = eval("c" + p);
于 2012-09-29T20:49:33.297 に答える