从对象中删除行



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

<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] 未定义

我无法在这里弄清楚它在哪里,因为我已经宣布它是全球性的。

这是因为您尝试错误地从数组中删除。 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(并重构代码)。由于break语句,这里不需要这样做。

你应该替换

delete statusData.Status[val];

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

以删除数组中的对象。

函数 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;
        }
    }
}

你在函数内的第二个 var 声明中在代码中犯了一个错误。var uniqueCounter = uniqueCounter + 1 => NAN + 1。你不需要第二次var,所以它只是唯一计数器 = 唯一计数器 + 1 => 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>

最新更新