我有一个包含数组的对象:
<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]未定义
我无法在这里找到它,因为我已经宣布它是全球性的。
答案 0 :(得分:2)
这是因为您试图从数组中错误地删除。 delete
运算符在数组上非常有趣。它用undefined
替换元素。看看这个:
>>> var A = [1, 2, 3];
>>> delete a[1];
>>> A;
[1, undefined, 3];
因此多次调用DelNewlyCreStatusRow
会引发异常,因为无法评估statusData.Status[val].uniqueId
(statusData.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>