6

以以下数组为例...

arr(0)(0) = 3
arr(0)(1) = name
arr(0)(2) = address
arr(1)(0) = 7
arr(1)(1) = name
arr(1)(2) = address
arr(2)(0) = 14
arr(2)(1) = name
arr(2)(2) = address

我需要从数组中删除中间元素(id=7)。我知道我需要遍历数组并将每个不被删除的记录移动到一个新数组中。我试过这样...

Dim newArr,i
Redim newArr(Ubound(arr))

For i = 0 to Ubound(arr)
    If (CStr(arr(i)(0)) <> 7 ) Then
        newArr(i) = arr(i)
    End if
Next

调试时,我可以看到 if 语句有效,所以我知道只复制了 2 个元素,但 newArr 在此结束时为空。我错过了什么。我是一个 PHP 编码器,对经典 asp 不熟悉,而且我习惯于使用数组函数来使这种事情变得不必要。任何帮助表示赞赏。谢谢你。

4

5 回答 5

7

您不需要新数组,只需重新分配项目并“裁剪”数组:

Const removalIndex = 1
For x=removalIndex To UBound(arr)-1
    arr(x) = arr(x + 1)
Next
ReDim Preserve arr(UBound(arr) - 1)

此代码将从主数组中删除索引 1 处的数组项。如果您事先不知道要删除的项目的索引,您可以通过对数组的简单循环轻松找到它。

于 2013-07-21T11:11:18.363 回答
6

您可以Scripting.Dictionary尝试使用数组,而不是使用数组。

它更加灵活,并且具有Remove方法等。

于 2013-07-19T18:58:03.463 回答
5

我建议将Scripting.Dictionary其用作列表/集合,因为它允许插入和删除。请参见此处:VBScript 中的列表

于 2013-07-19T18:58:04.283 回答
0

我看到一些 VBScript 语法问题。第一的:

arr(0)(0) = 3  'ERROR: Subscript out of range
arr(0, 0) = 3  'CORRECT

下一个:

ReDim newArr(Ubound(arr))  'this is 1 dimensional array
newArr(0) = arr(0)         'this will NOT work
newArr(0) = arr(0, 0)      'this will work

最后:为什么要转换为String,然后将其与Integerwith 进行比较:

(CStr(arr(i)(0)) <> 7)
于 2013-07-21T03:12:09.717 回答
0

我不知道确切的答案,但是如果我要在黑暗中猜测一下,我建议由于数组是二维的,也许您必须以这种方式明确引用它?

Dim newArr,i
Redim newArr(Ubound(arr),3)

For i = 0 to Ubound(arr)
    If (CStr(arr(i)(0)) <> 7 ) Then
        newArr(i)(0) = arr(i)(0)
        newArr(i)(1) = arr(i)(1)
        newArr(i)(2) = arr(i)(2)
    End if
Next
于 2013-07-19T20:50:45.810 回答