0

文字列を取り込んでオブジェクトに変換する次のコードがあります。問題は、文字列に重複する複数のキーが含まれており、オブジェクトに変換されると、最後のキーのみを認識することです。

これが私の作業デモですhttp://jsfiddle.net/Qt92d/

これが私のコードです:

    var str = 'View\n{\n    Name: View1;\n    Image\n    {\n        BackgroundImage: Image.gif;\n        Position: 0, 0;\n        Width: 320;\n        Height: 480;\n    }\n\n    Button\n    {\n        BackgroundImage: Button.gif;\n        Transition: View2;\n        Position: 49, 80;\n        Width: 216;\n        Height: 71;\n    }\n\n    Button\n    {\n        BackgroundImage: Button2.gif;\n        Position: 65, 217;\n        Width: 188;\n        Height: 134;\n    }\n\n    Label\n    {\n        Position: 106, 91;\n        Width: 96;\n        Height: 34;\n        Text: "Button";\n        FontSize: 32;\n        Color: 0.12549, 0.298039, 0.364706, 1;\n    }\n    Scroll\n    {\n        Position: 106, 91;\n        Width: 96;\n        Height: 34;\n        Button{\n            BackgroundImage: Button2.gif;\n            Position: 65, 217;\n            Width: 188;\n            Height: 134;\n        }\n        Button{\n            BackgroundImage: Button2.gif;\n            Position: 65, 217;\n            Width: 188;\n     \n      Height: 134;\n        }\n\n    }\n\n}';

str = str.replace(/(\w+)\s*\{/g, "$1:{"); // add in colon after each named object
str = str.replace(/\}(\s*\w)/g, "},$1"); // add comma before each new named object
str = str.replace(/;/g, ","); // swap out semicolons with commas
str = str.replace(/,(\s+\})/g, "$1"); // get rid of trailing commas
str = str.replace(/([\d\.]+(, [\d\.]+)+)/g, "[$1]"); // create number arrays
str = str.replace(/"/g, ""); // get rid of all double quotes
str = str.replace(/:\s+([^\[\d\{][^,]+)/g, ':"$1"');  // create strings

$("pre").html(str);

var obj;
eval("obj={" + str + "};");

上記のコードの出力は次のとおりです。複数の「ボタン」があることに注意してください。それが問題の始まりです。

    View:{
    Name:"View1",
    Image:{
        BackgroundImage:"Image.gif",
        Position: [0, 0],
        Width: 320,
        Height: 480
    },

    Button:{
        BackgroundImage:"Button.gif",
        Transition:"View2",
        Position: [49, 80],
        Width: 216,
        Height: 71
    },

    Button:{
        BackgroundImage:"Button2.gif",
        Position: [65, 217],
        Width: 188,
        Height: 134
    },

    Label:{
        Position: [106, 91],
        Width: 96,
        Height: 34,
        Text:"Button",
        FontSize: 32,
        Color: [0.12549, 0.298039, 0.364706, 1]
    },
    Scroll:{
        Position: [106, 91],
        Width: 96,
        Height: 34,
        Button:{
            BackgroundImage:"Button2.gif",
            Position: [65, 217],
            Width: 188,
            Height: 134
        },
        Button:{
            BackgroundImage:"Button2.gif",
            Position: [65, 217],
            Width: 188,

      Height: 134
        }

    }

}

ビュー、名前、ボタン、画像など、すべてのキーの末尾に自動インクリメントされた番号を追加する方法を理解しようとしています

4

1 に答える 1

1

オブジェクトの解析にはJSONライブラリを使用する必要があります。それは物事を大幅に簡素化します。

データを構造化する限り、「ボタン」、「ラベル」、「スクロール」タイプのオブジェクトは配列に格納され、キーはフィールドに格納されている必要があります。タイプをお勧めします。たとえば、JSONでデータを次のように簡単に表すことができます。

{                                                               
    View:{
        Name:"View1",
        Objects: [
        {
            Type: "Image",
            BackgroundImage:"Image.gif",
            Position: [0, 0],
            Width: 320,
            Height: 480
        },

        {
            Type: "Button",
            BackgroundImage:"Button.gif",
            Transition:"View2",
            Position: [49, 80],
            Width: 216,
            Height: 71
        },

        {
            Type: "Button",
            BackgroundImage:"Button2.gif",
            Position: [65, 217],
            Width: 188,
            Height: 134
        },
        {
            Type: "Label",
            Position: [106, 91],
            Width: 96,
            Height: 34,
            Text:"Button",
            FontSize: 32,
            Color: [0.12549, 0.298039, 0.364706, 1]
        },
        {
            Type: "Scroll",
            Position: [106, 91],
            Width: 96,
            Height: 34,
            Objects: [
                {
                    Type: "Button",
                    BackgroundImage:"Button2.gif",
                    Position: [65, 217],
                    Width: 188,
                    Height: 134
                },
                {
                    Type: "Button",
                    BackgroundImage:"Button2.gif",
                    Position: [65, 217],
                    Width: 188,

                    Height: 134
                }
            ]
        }
    }
}

このメソッドは複数のボタンオブジェクトをサポートしていることに注意してください。


編集

要件を考えると、これは効果的であることがわかりました。文字列のいずれかを置き換える前にvar i = 0;、最後の正規表現の後にこれを追加して追加します。

str = str.replace(/([^:] +):{/ g、function(m、p1){return p1 + "_" +(++ i).toString()+ ":{";}) ;

*これはあなたの魂を犠牲にしてあなたにあなたの望む結果を与えるでしょう*

あなたのフォーマットのための単純なパーサー/エンコーダーを書くことは難しくありません。コンテナオブジェクトは次のようになります。

{type: "view", "properties":{"name":"View1"}, "objects":[{"type":"Image","properties":{...}, "objects":[...]}, ...]}

And the logic is relatively simple. Objects are started by "[A-Za-z]+{" and closed by "}(,?)". Properties are started by "[A-Za-z]:" and are always closed by "}". Following those rules it shouldn't be hard to iterate over the characters in the string, appending each to a buffer until the buffer matches one or the other of the rules.

于 2012-12-28T07:05:25.933 に答える