0

このjson構造を考えると:

{
    "categoryID" : 1,
    "categoryName" : "Stupid Questions",
    "questions" : [{
            "question" : [{
                    "questionOptions" : [{
                            "questionOptionID" : 1,
                            "optionText" : "It's top secret."
                        }, {
                            "questionOptionID" : 2,
                            "optionText" : "Because I am big and your small. I am right and your wrong."
                        }, {
                            "questionOptionID" : 3,
                            "optionText" : "I will gladly pay you Tuesday for a hamburger today."
                        },
                    ],
                    "questionType" : "checkbox",
                    "questionText" : "Why can't we use more abstract table and column names?",
                    "summary" : "Question of the year"
                }
            ]
        }
    ]
}

question と questionOptions の両方を template と templateOptions にマップしたいと思います。

{
    "categoryID" : 1,
    "categoryName" : "Stupid Questions",
    "templates" : [{
            "template" : [{
                    "templateOptions" : [{
                            "templateOptionID" : 1,
                            "optionText" : "It is top secret."
                        }, {
                            "QuestionOptionID" : 2,
                            "OptionText" : "Because we are lazy."
                        }, {
                            "QuestionOptionID" : 3,
                            "OptionText" : "I will gladly pay you Tuesday for a hamburger today."
                        },
                    ],
                    "QuestionType" : "checkbox",
                    "QuestionText" : "Why can't we use more abstract table and column names?",
                    "Summary" : "Question of the year"
                }
            ]
        }
    ]
}

これが私のノックアウト マッピング オブジェクトの始まりです。

var templateMapping = {
  'templates': {
      templates: function(data) {
          return ko.utils.unwrapObservable(data.questions);
      }
  }
  //how do I map observable array of question options to observable  array of template options here?
};

このマッピングの重要な点は、サブオブジェクトの構造が異なることです (この質問とは異なり - https://stackoverflow.com/a/7535397/466321 )。私が見つけたすべてのマッピング例は、これがどのように行われるかをカバーしていないようで、私自身のいくつかの理論を試してみましたがうまくいきませんでした。

4

1 に答える 1

1

@Jeff Mercadoは正しいです。マッパーはこれを目的としていません。意図したことを達成するには、再帰的な JavaScript が少し必要です。

function myTransform(string) {
    // case-insensitive replace
    return string.replace(/question/i,'template');
}

function transformObject(source) {
    var result = {}
    for( var key in source ) {
        if( !source.hasOwnProperty(key) ) continue;
        var value = source[key];
        var newKey = myTransform(key);
        if( Object.prototype.toString.call(value) == "[object Array]" ) {
            result[newKey] = [];
            for( var i in value ) {
                if( !value.hasOwnProperty(i) ) continue;
                result[newKey][i] = transformObject(value[i]);
            }
        }
        else if( Object.prototype.toString.call(value) == "[object Object]" ) {
            result[newKey] = transformObject(value);
        }
        else {
            result[newKey] = value;
        }
    }
    return result;
}

var wow = transformObject(json);

このフィドルを参照してください

于 2012-10-25T09:58:34.697 に答える