0

配列を含むオブジェクトがあります:

<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

4 に答える 4

2

これは、アレイから誤って削除しようとしているためです。delete演算子は配列ではかなり面白いです。要素を。に置き換えますundefined。これをチェックしてください:

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

したがって、複数回呼び出すと、評価できないため(is ) 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ステートメントのため、これはここでは必要ありません。

于 2012-11-27T13:00:03.887 に答える
1

交換する必要があります

delete statusData.Status[val];

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

配列内のオブジェクトを削除します。

于 2012-11-27T12:59:56.687 に答える
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;
        }
    }
}
于 2012-11-27T13:04:53.280 に答える
0

関数内の2番目のvar宣言でコードにエラーがありました。var uniqueCounter = uniqueCounter + 1 => NAN +1。2回目はvarを必要としないため、uniqueCounter = uniqueCounter + 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>
于 2012-11-27T13:12:33.747 に答える