4

JSON経由でPerlオブジェクトをjavascriptに渡す必要があるプロジェクトを行っています。「中間」オブジェクト定義に関して問題に直面しています。

Perl では、オブジェクトはハッシュで表され、プログラマーは「中間」に何かを定義する必要はありません。プロパティが作成されると、すべての中間オブジェクトがハッシュ参照として自動的に作成されます。例えば

$graph{chart}{yAxis}{title} = "Temperature Tracking";

ただし、このオブジェクトが Javascript に渡されると、次のような「中間」オブジェクトに新しいプロパティを追加したい場合:

graph.chart.xAxis.title = "Time Sequence";

「未定義のgraph.chart.xAxis」エラーが発生します。Perl とは異なり、単にプロパティを割り当てるだけでは、Javascript は自動的にオブジェクトを作成しません。

現時点では、以下のソリューションを使用する必要があります。

if (!graph.chart.xAxis) {
  graph.chart.xAxis = {};
  graph.chart.xAxis.title = "Time Sequence";
}

残念ながら、私たちのプロジェクトでは、Perl から渡されたオブジェクトは非常に動的であり、Javascript が認識できないオブジェクトが他にもたくさんあります。上記の方法では、JS コードがかなり長くなり、「醜い」ものになります。Javascript を Perl のように動作させるためのより良い解決策はありますか?つまり、中間オブジェクトを手動で作成する必要はありませんか?

4

4 に答える 4

3

これが要件を満たしているかどうかはわかりませんが、不足しているオブジェクトを作成するための単純な関数は次のようになります。

function insertNode(obj, node, value) {
    var segments = node.split('.');
    var key = segments.pop();
    var ref = obj;

    while (segments.length > 0) {
        var segment = segments.shift();
        if (typeof ref[segment] != 'object') {
            ref[segment] = {};
        }
        ref = ref[segment];
    }

    ref[key] = value;
};

var x = {};
insertNode(x, 'foo.bar.baz', 'hello world');
alert(x.foo.bar.baz); // "hello world"

デモ: http: //jsfiddle.net/sNywt/1/

于 2013-03-17T09:42:56.097 に答える
2

たぶん、このObject拡張機能は次のようになります。

Object.prototype.val = function(prop,val){
  prop = /\./i.test(prop) ? prop.split('.') : prop;
  if (prop.constructor === Array){
      var objnow = this, pr;
      while (pr = prop.shift()){
        if (!objnow[pr]){
            objnow[pr] = {};
        }
        if (!prop.length) {
            objnow[pr] = val;
        }
        objnow = objnow[pr];
      }
      for (var l in objnow){
          this[l] = objnow[l];
      }
  } else {
      this[prop] = val;
  }
}
// usage
var myO = {};
myO.val('a.b.c',3);        //=> myO.a.b.c = 3
myO.val('someprop',3);     //=> myO.someprop = 3
myO.val('a.b.someprop',5); //=> myO.a.b.someprop = 3
于 2013-03-17T09:57:49.010 に答える
2

steeltoeというライブラリに興味があるかもしれません

steelToe(graph).set('chart.xAxis.title', 'Time Sequence');
于 2013-03-17T09:48:23.030 に答える
2

あなたの場合に適しているかどうかはわかりませんが、プロパティの存在を確認し、存在しない場合は次のように作成できます。

function use_or_create(obj, prop) {
   return (obj.hasOwnProperty(prop))  ? true : (obj[prop] = {});
}
var graph.chart = {}; //your object
//function call to check if property exist before trying to use it
use_or_create(graph.chart, 'xAxis'); //check if xAxis exists and creates one if doesnot
graph.char.xAxis.title = "tested";
于 2013-03-17T09:49:07.560 に答える