1

だから私はJavascriptのオブジェクトに解析されるJSONファイルを持っています。私はあなたが何を考えているか知っています:ラッキーガイ。JSON は基本的に、大きなツリー形式のフロー図です。ここに私が達成しようとしているものの小さなサンプルがあります:

tree = {
    "options": [
        {
            "options": [
                {
                    "name": "target",
                },
            ],
        },
        {
            "options": [
                {
                    "link": "...?",
                },
            ],
        },
    ]
}

したがって、この例では、2 番目のブランチ ( と表示されている場所"link") に深く入り、 を含むブランチにジャンプできるようにしたいと考えています"name": "target"。これは JSON を覚えているので、文字列である必要があります (リンク用のネイティブがない限り?! ありますか?) が、それをフォーマットする最善の方法がわかりません。

私が見ているように、私には少なくともいくつかのオプションがあります。

  1. 検索できました。が一意であればname、要素が見つかるまでツリーをスケーリングして要素を探すことができました。これまでJavascriptを使ったことはありませんが、遅いと思います。

  2. options:1:options:1パスの各キーを記述するようなナビゲーション パスを使用できます。繰り返しますが、これを行ったことはありませんが、エラーがないと仮定すると、はるかに高速になります。どのように実装しますか?

他に利用できるオプションはありますか? 一番いいと思われるものは何ですか?JSON デコード時にこれをアンパックする方法はありますか、それとも無限ループのレシピですか?

4

1 に答える 1

3

ではどうlink: 'tree.options[0].options[0]'ですかeval(path.to.link)

次のサンプルは、Chrome のみでテストされました。すべての同じツリー:

var tree = { level1: [{ key: 'value' }] };

いいえeval

function resolve(root, link) {
    return (new Function('root', 'return root.' + link + ';'))(root);
}

var value = resolve(tree, path.to.link);

フォールバックwindow

function resolve(root, link) {
    return (new Function(
        'root', 'return root.' + (link || root) + ';'
    ))(link ? root : window);
}

resolve(tree, 'level1[0].key'); // "value"
resolve('tree.level1[0].key'); // "value"

エラーのキャッチ

try/catch ブロックは、壊れたリンクがエラーをスローするのを防ぎます。

function resolve(root, path) {
    try {
        return (new Function('root', 'return root.' + path + ';'))(root);
    } catch (e) {}
}

resolve(tree, 'level1[0].key'); // "value"
resolve(tree, 'level1[1].key'); // undefined

カスタム パス形式の使用

ここでの良い点は、オブジェクトまたは配列を として渡すことができることrootです。path.split('/')また、スラッシュを選択した任意の文字に置き換えることができることにも注意してください。

function resolve(root, path) {
    path = '["' + path.split('/').join('"]["') + '"]';
    return (new Function('root', 'return root' + path + ';'))(root);
}

resolve(tree.level1, '0/key'); // "value"
resolve(tree, 'level1/0/key'); // "value"
resolve(tree, 'level1/0'); // Object {key: "value"}
于 2013-08-22T13:16:13.167 に答える