当Javascript中没有定义集合时,为什么push不起作用?

时间:2013-08-11 15:20:32

标签: javascript

我有以下代码:

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)

如果目前没有定义答案,有没有办法可以重构它以使其有效。

3 个答案:

答案 0 :(得分:5)

您在此声明中为formData.answers分配0:

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

我的猜测是您要将formData.answersnull进行比较。您想使用!=(或!==)而不是第二个=

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

这解释了关于“对象0没有方法'推送'的奇怪消息”。但请注意,如果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);

答案 1 :(得分:2)

只需检查密钥是否存在,如果不存在,请创建密钥:

if (!formData.hasOwnProperty("answers") || formData.answers === null) {
    formData.answers = [];
}

答案 2 :(得分:1)

初始化这个变量:

 formData.answers = new Array();

然后记得将它视为一个数组。