JSON:未捕获的TypeError:无法设置属性'值'未定义的

时间:2015-10-21 09:32:35

标签: javascript jquery json

我试图将页面上所有textareas的值传递给JSON表。 出于某种原因,我得到一个"无法设置未定义错误的值",我不明白,因为我的Json是先前定义的。

以下是具有2个功能的代码。

function parseToJson() {
    var json = {};

    $("input.invoice_details").each(function () {
        json[this.id] = $(this).val();
    });

    $("select.invoice_details").each(function () {
        json[this.id] = $(this).val();
    });

    json.categories = {};

    $("textarea.invoice_categories").each(function () {
        if (this.value.trim() !== '') {
            json.categories[this.id].values = splitInput(this);
            json.categories[this.id].label = this.name;
        }
    });
    console.log(JSON.stringify(json));
    generatePreveiw(json);
}

function splitInput(textArea) {
    var input = textArea.value.trim();
    var lines = input.split("\n");
    var array = [];
    $.each(lines, function (indexLine, line) {
        var columns = line.split("\t");
        var obj = {};
        $.each(columns, function (indexColumn, column) {
            var columnName = columnsName.columnsName[indexColumn].name;
            obj[columnName] = column;
        });
        array.push(obj);
    });
    return array;
}

3 个答案:

答案 0 :(得分:1)

        json.categories[this.id].values = splitInput(this);
        json.categories[this.id].label = this.name;

应该是:

        json.categories[this.id] = {
            values: splitInput(this),
            label: this.name
        };

如果尚未首先创建对象,则无法设置对象的属性。您可以使用此对象文字语法一步创建对象及其属性。

答案 1 :(得分:0)

json.categories = {};

你有一个空对象

json.categories[this.id].values = splitInput(this);

现在,您正尝试从该对象访问名为this.id的属性。

由于该对象尚未具有任何属性,因此始终为undefined

然后尝试分配undefined.value = splitInput(this),这会引发错误。

您需要确保json.categories[this.id]具有值,然后才能在其上设置属性。

答案 2 :(得分:0)

问题是您正在尝试访问存储在json.categories [this.id]中的对象的属性。 不幸的是它未定义。 请尝试以下方法:

function() {
        if (this.value.trim() !== '')
        { 
            //Initialize to an empty object if necessary
            json.categories[this.id] = json.categories[this.id] || {};
            json.categories[this.id].values = splitInput(this);
            json.categories[this.id].label = this.name;
        }
    });