0

次のコードがあります。

var maxNum = formData.answers = null ? Math.max.apply(Math, formData.answers.map(function (o) { return o.number; })) : 0;
var emptyAnswer = {
    "number": maxNum + 1,
    "correct": false,
    "name": "",
    "notes": "",
    "topicId": formData.topicId
};
formData.answers.push(emptyAnswer);

formData の一部としてすでに回答コレクションがある場合、コードは機能しますが、formData.answers が null の場合は機能しません。次のメッセージが表示されます。

TypeError: Object 0 has no method 'push'
    at Object.$scope.modalAddAnswer (http://127.0.0.1:81/Content/app/admin/controllers/question-controller.js:113:30)

現在回答が定義されていない場合、これをリファクタリングして機能させる方法はありますか。

4

3 に答える 3

5

formData.answersこのステートメントで に0 を割り当てています。

var maxNum = formData.answers = null ? Math.max.apply(Math, formData.answers.map(function (o) { return o.number; })) : 0;

私の推測では、あなたは と比較しようとしていformData.answersますnull。2 番目の代わりに!=(または)を使用する場合:!===

var maxNum = formData.answers != null ? Math.max.apply(Math, formData.answers.map(function (o) { return o.number; })) : 0;

これは、「オブジェクト 0 にはメソッド 'push' がありません」という奇妙なメッセージを説明しています。ただし、 が の場合formData.answersnullまだpush機能しないことに注意してください。formData.answers空の配列に設定する必要があります。このコードをお勧めします:

var maxNum = 0;
if (formData.answers == null) {
    formData.answers = [];
} else if (formData.answers.length > 0) {
    maxNum = Math.max.apply(Math,
        formData.answers.map(function (o) { return o.number; }));
}
formData.answers.push(emptyAnswer);
于 2013-08-11T15:25:30.117 に答える
2

キーが存在するかどうかを確認し、存在しない場合は作成します。

if (!formData.hasOwnProperty("answers") || formData.answers === null) {
    formData.answers = [];
}
于 2013-08-11T15:22:55.157 に答える
1

この変数を次のように初期化します。

 formData.answers = new Array();

そして、常に配列のように扱うことを忘れないでください。

于 2013-08-11T15:23:13.543 に答える