1

.stringify メソッドを使用して JSON 文字列に簡単に変換できる多次元 Javascript オブジェクトがあります。同様のことを行う関数を作成しようとしていますが、XML、マークアップ、形式です。問題は、任意の数の次元を処理できるようにしたいということです。

次のような値を持つ多次元オブジェクトがあるとします。

object['annualrevenues']['option0']['ID'] = 1;
object['annualrevenues']['option0']['text'] = '$50mil';
object['annualrevenues']['option1']['ID'] = 2;
object['annualrevenues']['option1']['text'] = '$100mil';
object['annualrevenues']['option2']['ID'] = 3;
object['annualrevenues']['option2']['text'] = '$200mil';

次のような文字列を作成したい:

var xmlText = <xml><annualrevenues><option0><ID>1</ID><text>$50</text></option0></annualrevenues></xml>

contentType 'XMLDOC' で応答として返されると、次のようになります。

<xml>
  <annualrevenues>
    <option0>
      <ID>1</ID>
      <text>$50</text>
    </option0>
  </annualrevenues>
</xml>

だから私は次の機能を持っています:

var xmlText = '<xml>';
    xmlText += formatXMLSubObjects(objText,xmlText);

function formatXMLSubObjects(objText,xmlText){
  for (prop in objText) {
    if (typeof objText[prop] == 'object') {
        xmlText += '<'+prop+'>';
        for (subProp in objText[prop]) {
            if (typeof objText[prop][subProp] == 'object') {
                // Run the function again as recursion
                xmlText += formatXMLSubObjects(objText[prop][subProp],xmlText);
            }
            else {
                xmlText += '<' + subProp + '>' + objText[prop][subProp] + '</' + subProp + '>';
            }
        }
        xmlText += '</'+prop+'>';
    }
    else {
        xmlText += '<'+prop+'>'+objText[prop]+'</'+prop+'>';
    }
  }
return xmlText;
}

問題は、formatXMLSubObjects 関数が 2 番目の呼び出しから戻るときに、最初の呼び出しの元のオブジェクトが上書きされ、未定義になっていることです。

これを手伝ってくれる人はいますか?

4

1 に答える 1

2

xmlTextの定義を関数内に移動し、外部の別の変数を使用して初期ペイロードとforループ内のローカル変数を含めます。そうしないと、グローバルで上書きされたと見なされ、xmlTextが呼び出しに渡されません。結果を毎回前の結果と連結します。

function formatXMLSubObjects(objText) {
   var xmlText = ""; // this will contain only this chunk of the object

   for (var prop in objText) {
      xmlText += '<'+prop+'>'; // place the tag anyway
      if (typeof objText[prop] == 'object') {
            xmlText += formatXMLSubObjects(objText[prop]); // if it's an object recurse
      } else {
            xmlText += objText[prop]; // ... otherwise just add the value (this will work only for simple values
      }
   xmlText += '</' + prop + '>';
   }
   return xmlText;
}

var xml = '<xml>';
xml += formatXMLSubObjects(obj);
xml += '</xml>';

このフィドルを見てください:http://jsfiddle.net/vZjAP/

于 2013-03-06T21:29:50.603 に答える