从Object中删除行

时间:2012-11-27 12:42:23

标签: javascript jquery

我有一个包含数组的对象:

<script type="text/javascript">
    var statusData = {
        Status: []
    };

    var uniqueCounter = 1

    function createJsonFmtData() {      

        // Used as unique id at client side 
        var uniqueCounter =uniqueCounter + 1;

        statusData.Status.push({
            "Name": Name,
            "Time": Time,
            "Email": Mail,
            "Name": Type,
            "Value": Value,
            "uniqueId": uniqueCounter
        });
    }

    function DelNewlyCreStatusRow(rowId) {
        // First pop elment from json data
        var val;
        for (val = 0; val < statusData.Status.length; ++val) {
            if (statusData.Status[val].uniqueId == rowId) {
                delete statusData.Status[val];
                break;
            }
        }
</script>

尝试拨打DelNewlyCreStatusRow时会出错:

  

TypeError:statusData.Status [val]未定义

我无法在这里找到它,因为我已经宣布它是全球性的。

4 个答案:

答案 0 :(得分:2)

这是因为您试图从数组中错误地删除。 delete运算符在数组上非常有趣。它用undefined替换元素。看看这个:

>>> var A = [1, 2, 3];
>>> delete a[1];
>>> A;
[1, undefined, 3];

因此多次调用DelNewlyCreStatusRow会引发异常,因为无法评估statusData.Status[val].uniqueIdstatusData.Status[val]undefined)。

要解决此问题,请使用此代码而不是delete

var val;
for (val = 0; val < statusData.Status.length; ++val) {
    if (statusData.Status[val].uniqueId == rowId) {
        statusData.Status.splice( val, 1 );
        break;
    }
}

请注意,splice会修改数组,因此如果您想一次性执行多次删除,则必须将for循环替换为while(并重构代码a位)。由于break语句,此处不需要这样做。

答案 1 :(得分:1)

你应该替换

delete statusData.Status[val];

statusData.Status.splice(val,1);
val -= 1;

删除数组中的对象。

答案 2 :(得分:0)

DelNewlyCreStatusRow函数缺少结束'}'

function DelNewlyCreStatusRow(rowId) {
    // First pop elment from json data
    var val;
    for (val = 0; val < statusData.Status.length; ++val) {
        if (statusData.Status[val].uniqueId == rowId) {
            delete statusData.Status[val];
            break;
        }
    }
}

答案 3 :(得分:0)

您在函数内的第二个var声明中的代码中出错。 var uniqueCounter = uniqueCounter + 1 =&gt; NAN + 1。 你第二次不需要var,所以它只是 uniqueCounter = uniqueCounter + 1 =&gt; 2。

然后删除在我的案例中工作正常。

<script type="text/javascript">

        var statusData = {
            Status : []
        };

        var uniqueCounter = 1

        function createJsonFmtData() {

            var statusName = $('#<%= ddlStatus.ClientID %> option:selected').text();
            var dateTime = $("#body_ctl04_ctl02").val();
            var forceMail = ($("#chkForceMail").is(':checked')) ? 1 : 0;
            var noteType = $('#divTrackId').text();
            var dataValue = $("#<%=txtTrackId.ClientID %>").val();
            var curLogedUserName = $("#<%=curLoginUserName.ClientID %>").val();

            // Used as unique id at client side
            uniqueCounter = uniqueCounter + 1;

            statusData.Status.push({

                "statusName" : statusName,
                "dateTime" : dateTime,
                "forceEmail" : forceMail,
                "typeName" : noteType,
                "dataValue" : dataValue,
                "uniqueId" : uniqueCounter
            });
        }

        function DelNewlyCreStatusRow(rowId) {

            // First pop elment from json data
            var val;
            for ( val = 0; val < statusData.Status.length; ++val) {
                if (statusData.Status[val].uniqueId == rowId) {
                    console.log(typeof(statusData.Status[val]));
                    delete statusData.Status[val];
                    break;
                }
            }
        }
        createJsonFmtData();
        console.log(statusData);
        DelNewlyCreStatusRow(2);
        console.log(statusData);
    </script>