2

私はこれでほとんどそこにいますが、この機能を計画どおりに進めることができないようです.

私はjson 'jsonData'を持っています。これにはさまざまな用語の式が含まれています

"jsonData":{
            "a" : "b + c",
            "b" : "d + e",
            "d" : "h + i",
            "c" : "f + g"
        }

私がやろうとしているのは、関数に1つの引数「mainItem」(つまり、「jsonData」などの「jsonData」のキーの1つa)を渡すことです。この関数内で、json データから式を取得し (たとえば、a は「mainitem」でb + cあり、式です)、式の子コンポーネントの依存関係をチェックします。つまり、json の行に依存関係があるかどうかbをチェックします。cデータ。依存関係がある場合、たとえばbjson データに数式がある場合など、子コンポーネントとして親に追加されます。b親 'mainitem' の子コンポーネントに 'mainitem' として追加されますa。コードの最後に、これが私が取得したいものです。

{
mainitem : "a",
formula : "b+c",
childComponent: {
                 mainitem: "b",
                 formula : "d+e",
                 childcomponent: {
                                  mainitem: "d",
                                  formula : "h+i"
                                  }
                 },
                 {
                 mainitem: "c",
                 formula : "f+g"
                 },
}

問題は、親オブジェクトを作成できることです。しかし、親の子コンポーネントを作成する方法がわかりません。子コンポーネントにサブ子がある場合、子コンポーネントの子としても埋め込まれます。親子階層シリーズのようなものです

function getJson(mainItem) {
  var json = {};
  json['mainitem'] = mainItem;
  $.each(jsonData, function(key, value){
    if(mainitem == key){
      json['formula'] = value;
    }
  })
}

これについての洞察は高く評価されます。ありがとうございました。

4

4 に答える 4

2

「式」を構成する各コンポーネント/アイテムに分割し、各コンポーネント/アイテムの依存関係をチェックする再帰関数を作成する必要があります/書くことができます。

ここに解決策があります:http://jsfiddle.net/mqchen/4x7cD/

function getJson(item, data) {

    if(!data["jsonData"].hasOwnProperty(item)) return null;

    var out = {
        mainItem: item, 
        formula: data["jsonData"][item]
    };

    // Break up formula
    var components = out.formula.split(" ");

    for(var i = 0; i < components.length; i++) {
        var child = getJson(components[i], data); // Recursive call to get childComponents
        if(child !== null) {
            out["childComponent"] = out["childComponent"] == undefined ? [] : out["childComponent"];
            out["childComponent"].push(child);
        }
    }

    return out;
}

// Call it
getJson("a", data)

: 循環依存関係、つまりa: "b + c", b: "d + a".

于 2013-07-31T07:03:57.100 に答える
1

ええ、これは、古典的なパーサー/コンパイラの問題のように、ある種の構文ツリーを構築することです。

あなたが望むことをするこの単純な再帰関数を私が書いた方法。ただし、ある種のパーサーを構築することが目標である場合は、パーサー/コンパイラ構築の原則に従うことを考える必要があります。これにより、関数が成長し始めたときに物事を管理および把握できるようになります。

    function getJson(mainitem,outjson)
    {
        formula = jsonData[mainitem]; 
        outjson.mainitem = mainitem;

        if (formula != null)
        {
            outjson.formula = formula;
            var firstItem = formula.toString().charAt(0);
            var secondItem = formula.charAt(formula.length - 1);                
            outjson.firstchild = {};
            outjson.secondchild = {};
            getJson(firstItem, outjson.firstchild);
            getJson(secondItem, outjson.secondchild);
        }
    }

あなたがしなければならないことは、空のオブジェクトを作成し、それをgetJson()問題のオペランド、つまりmainitemとともに渡すことです:

    var outjson = {};
    getJson("a", outjson);

ライブラリを使用して、オブジェクトを JSON テキストJSONに変換しました。outjson

またoutjson、組み込みの firebug lite のコンソール ウィンドウで確認できるように、これをログに記録しました。

JSFiddleで見つけてください。

于 2013-07-31T08:58:07.997 に答える
1

これは依存関係の問題です。循環依存関係を処理する方法を理解する必要があることを事前にお伝えできます (出力を生成しようとするときに、無限ループ/再帰に陥りたくありません)。基本的なアルゴリズムを見てみましょう。必要なものは何ですか?

  1. 数式が意味を持つように構文解析する方法が必要です。この例では、フォームの入力を取得すると仮定します。a + b + cここでは、アイテムのみを想定し、+各アイテムを区切ります。
  2. ネストされた を作成するには、アイテムの依存関係を再帰する方法が必要childcomponentです。

    // assuming jsonData is available in this scope
    
    function getStructure (elem) {
        elem = $.trim(elem);
    
        // handling an element that doesn't exist in jsonData
        if (!jsonData[elem]) {
            return {
                'mainitem': elem,
                'formula': 'none' // or whatever you want to put
            };
        }
    
        var result = {},
            formula = jsonData[elem],
            children = formula.split('+'),
            i;
    
        result['mainitem'] = elem;
        result['formula'] = formula;
    
        // or however you want to store the child components
        result['childComponent'] = [];
    
        for (i = 0; i < children.length; i += 1) {
            result['childComponent'].push(getStructure(children[i]));
        }
    
        return result;
    }
    
于 2013-07-31T07:03:36.730 に答える