0

特定のデータに基づいて動的な JSON オブジェクトを作成しようとしています。ソースコード

次のテキストを入力すると:

here
is
an:example
of:
how:this:works

以下を生成します。

[
  "here",
  "is",
  {
    "an": "example"
  },
  {
    "of": ""
  },
  {
    "how": {
      "this": "works"
    }
  }
]

次を返すようにするにはどうすればよいですか: ( foo に値がないため、オブジェクトを配列にプッシュします)

[
  "here",
  "is",
  {
    "an": "example"
  },
  {
    "of": [
      "how": {
        "this": "works"
      }
    ]
  }
]
4

1 に答える 1

1

あなたの質問はあまり明確ではないので、私は推測する必要があります... 続くすべての値をof:配列に入れますか? したがって、基本的には、次のようにインデントを使用して元の入力を記述できます (すべてのインデントは新しい配列を示します)。

here
is
an:example
of:
    how:this:works:
        foo:bar
        example

さらに、2 番目の JSON の例は正しくありませof:ん。配列はキーを持つことができないため、配列の内容を中かっこで囲む必要があります。

上で説明した結果を得たいと仮定すると、再帰を使用してこれを非常に簡単に行うことができます。

var jsonify = function(input) {
    var helper = function(items) {
        var end = [];
        for (i = 0; i < items.length; ++i) {
            var itemparts = items[i].split(':');
            var value = itemparts.pop();
            var dobreak = false;
            while (itemparts.length) {
                var obj = {};
                if (value == "" && i+1 < items.length) {
                    // Recursive call
                    value = helper(items.slice(i+1,items.length));
                    dobreak = true;
                }
                obj[itemparts.pop()] = value;
                value = obj;
            }
            end.push(value);
            if (dobreak) {
                break;
            }
        }
        return end;
    };

    return helper(input.split('\r\n'));
};

この関数は、長さゼロの値を検索し、次の行に値があるかどうかをチェックします。その場合、( ) に続くすべての値はitems.slice(...)、同じ関数で (つまり、再帰的に) 個別に処理され、配列に入れられます。

上記の入力例で呼び出すjsonifyと、次の JSON が得られます。

[
    "here",
    "is",
    {
        "an": "example"
    },
    {
        "of": [
            {
                "how": {
                    "this": {
                        "works": [
                            {
                                "foo": "bar"
                            },
                            "example"
                        ]
                    }
                }
            }
        ]
    }
]

それが役立つことを願っています...;)

于 2012-08-07T12:33:50.080 に答える