26
2019.2
数组函数
作者: POPASP
POP_MVC.Arr(1.5版本以前为POP_MVC.Array,为了与函数Array不重名,故改为Arr)的数组处理函数,主要有五大类:修改、取片段、查找、迭代、排序、其他
## 修改函数
修改函数直接修改传入的数组,这点须注意。
### Push 函数
**功能**
向数组尾部添加一个元素
**参数说明**
Sub Push( byref arr,byval item )
arr 参数,待操作数组,如果arr不是数组,则将其转化为数组
item 参数,待操作元素
**返回值**
无返回值,直接将元素添加到数组上
**举例1**
```brush:vb
dim arr
POP_MVC.Arr.Push arr,1
POP_MVC.Arr.Push arr,"a"
POP_MVC.Arr.Push arr,2
POP_MVC.Arr.Push arr,"b"
var_export arr '[1, "a", 2, "b"]
```
**举例2**
```brush:vb
dim arr
arr = "初始值"
POP_MVC.Arr.Push arr,"c"
POP_MVC.Arr.Push arr,"d"
var_export arr '["初始值", "c", "d"]
```
### Unshift 函数
**功能**
向数组头部添加一个元素
**参数说明**
Sub Unshift( byref arr,byval item )
arr 参数,待操作数组,如果arr不是数组,则将其转化为数组
item 参数,待操作元素
**返回值**
无返回值,直接将元素添加到数组上
**举例1**
```brush:vb
dim arr
POP_MVC.Arr.Unshift arr,1
POP_MVC.Arr.Unshift arr,"a"
POP_MVC.Arr.Unshift arr,2
POP_MVC.Arr.Unshift arr,"b"
var_export arr '["b", 2, "a", 1]
```
**举例2**
```brush:vb
dim arr,dict
arr = "初始值"
set dict = D_
dict.Add "dict","Dictionary对象"
POP_MVC.Arr.Unshift arr,"c"
POP_MVC.Arr.Unshift arr,dict
var_export arr '[{"dict":"Dictionary对象"}, "c", "初始值"]
```
### Insert 函数
**功能**
向数组某个下标处插入元素,其后元素后移
**参数说明**
Sub Unshift( byref arr,byval item )
arr 参数,待操作数组,如果arr不是数组,则将其转化为数组
pos 参数,待插入的下标位置,
* 从0处插入元素,相当于使用了Unshift
* 插入位置大于数组长度,则从尾部插入,相当于Push
* 如果插入位置是负数,那么从尾部开始算起,-1为最后一个元素,-2为倒数第2个元素
item 参数,待操作元素
**返回值**
无返回值,直接将元素添加到数组上
**举例**
```brush:vb
dim arr,dict
arr = "初始值"
'从0处插入元素,相当于使用了Unshift
POP_MVC.Arr.Insert arr,0,"1" '[1, "初始值"]
'插入位置大于数组长度,则从尾部插入,相当于Push
POP_MVC.Arr.Insert arr,5,"2" '[1, "初始值", 2]
'如果插入位置是负数,那么从尾部开始算起,-1为最后一个元素,-2为倒数第2个元素
POP_MVC.Arr.Insert arr,-1,3 '[1, "初始值", 3, 2]
'如果负数的绝对值大于数组长度,则相当于使用了Unshift
POP_MVC.Arr.Insert arr,-100,4 '[4, 1, "初始值", 3, 2]
```
### InsertArr 函数
**功能**
向数组某个下标处插入一组元素,其后元素后移
**参数说明**
Sub InsertArr( ByRef arr,ByVal pos,ByRef items )
arr 参数,待操作数组,如果arr不是数组,则将其转化为数组
pos 参数,待插入的下标位置,
* 从0处插入元素,相当于使用了Unshift
* 插入位置大于数组长度,则从尾部插入,相当于Push
* 如果插入位置是负数,那么从尾部开始算起,-1为最后一个元素,-2为倒数第2个元素
items 参数,待插入的数组
**返回值**
无返回值,直接将元素添加到数组上
**举例**
```brush:vb
dim arr,items
arr = array(1,2,3)
items = array("a","b")
'从下标为1的之间插入数组
'POP_MVC.Arr.InsertArr arr,1,items '[1, "a", "b", 2, 3]
'从最后一个元素之前插入数组
'POP_MVC.Arr.InsertArr arr,-1,items '[1, 2, "a", "b", 3]
'从头上插入数组
'POP_MVC.Arr.InsertArr arr,0,items '["a", "b", 1, 2, 3]
'从尾部插入数组
'POP_MVC.Arr.InsertArr arr,ubound(arr)+1,items '[1, 2, 3, "a", "b"]
'给一个大于数组长度的值,仍从尾部插入数组
'POP_MVC.Arr.InsertArr arr,100000,items '[1, 2, 3, "a", "b"]
```
上面四个函数,Push、Unshift、Insert、InsertArr四个函数都是向数组中添加元素,前三个函数是将元素插入到数组中,如果元素为数组,插入到数组中后,仍旧保留数组格式,InsertArr与前三个不同,它是将一个数组中的各个元素插入到另一个数组中。这四个函数均无返回值,直接操作的是传入的数组。
有插入就有删除,删除数组元素的函数有Pop、Shift、Remove函数。
### Pop 函数
**功能**
从尾部删除一个元素,并返回该元素
**参数说明**
Function Pop( ByRef arr )
arr 参数,待操作数组
**返回值**
返回被删除的元素。如果arr不是数组,返回值为Empty,注意返回的元素可能为对象,如果要判断返回元素的类型,可以使用 POP_MVC.Arr.item ,该属性保存的是最后一次删除的元素
**举例**
```brush:vb
dim arr,dict,items,ret
arr = array(1,2,3)
set dict = D_
dict("test") = "obj"
'注意最后一个元素为对象
POP_MVC.Arr.push arr,dict
'将数组元素打乱,无法确定对象在哪里了
POP_MVC.Arr.Shuffle arr
'下面这种写法很可能出错,因为没法确定弹出的最后一个元素不是对象,如果是对象须使用set
ret = POP_MVC.Arr.Pop(arr) '如果能确定所有的元素都不是对象,这种写法则没问题
'混杂着标量与对象的数组,取元素应该如下使用
call POP_MVC.Arr.Pop(arr)
if isObject( POP_MVC.Arr.item ) then
set ret = POP_MVC.Arr.item
else
ret = POP_MVC.Arr.item
end if
```
### Shift 函数
**功能**
从头部删除一个元素,并返回该元素
**参数说明**
Function Shift( ByRef arr )
arr 参数,待操作数组
**返回值**
返回被删除的元素。如果arr不是数组,返回值为Empty,注意返回的元素可能为对象,如果要判断返回元素的类型,可以使用 POP_MVC.Arr.item ,该属性保存的是最后一次删除的元素
**举例**
```brush:vb
dim arr,dict,items,ret
arr = array(1,2,3)
set dict = D_
dict("test") = "obj"
'注意最后一个元素为对象
POP_MVC.Arr.push arr,dict
'将数组元素打乱,无法确定对象在哪里了
POP_MVC.Arr.Shuffle arr
'Pop函数是从尾部弹出一个元素,而Shift正好与它相反,是从头部删除一个元素
'同Pop函数,下面这种写法很可能出错,因为没法确定被删除元素的数据类型
ret = POP_MVC.Arr.Shift(arr) '如果当初在设计数组时,已经知道元素都是标量,则可以这样使用
'混杂着标量与对象的数组,取元素应该如下使用
call POP_MVC.Arr.Shift(arr)
if isObject( POP_MVC.Arr.item ) then
set ret = POP_MVC.Arr.item
else
ret = POP_MVC.Arr.item
end if
```
### Remove 函数
**功能**
从数组中按下标位置删除一个元素
**参数说明**
Function Shift( ByRef arr )
arr 参数,待操作数组
pos 参数,待删除元素的下标
如果下标小于0,则-1代表最后一个元素(即ubound(arr) ),-2代表倒数第二个元素
如果下标大于数组的最大上标,如果下标值无效,不进行交换。
**返回值**
返回被删除的元素。如果arr不是数组,返回值为Empty,注意返回的元素可能为对象,如果要判断返回元素的类型,可以使用 POP_MVC.Arr.item ,该属性保存的是最后一次删除的元素
**举例**
```brush:vb
dim arr,dict,items,ret
arr = array(1,2,3)
set dict = D_
dict("test") = "obj"
'注意最后一个元素为对象
POP_MVC.Arr.push arr,dict
'将数组元素打乱,无法确定对象在哪里了
POP_MVC.Arr.Shuffle arr
'Pop函数与Shift函数是从两端删除元素,而Remove须明确指定位置
'同Pop、Shift函数,下面这种写法很可能出错,因为没法确定被删除元素的数据类型
ret = POP_MVC.Arr.Remove(arr,1) '如果当初在设计数组时,已经知道元素都是标量,则可以这样使用
'混杂着标量与对象的数组,取元素应该如下使用
call POP_MVC.Arr.Remove(arr,1)
if isObject( POP_MVC.Arr.item ) then
set ret = POP_MVC.Arr.item
else
ret = POP_MVC.Arr.item
end if
```
除了上面的给数组增加或者删除元素的数组外,还有其他几个函数,也涉及到了修改数组。
### Swap 函数
**功能**
交换数组中两个下标的值
**参数说明**
sub Swap( ByRef arr, ByVal i, ByVal j)
arr 参数,待操作数组
i 参数,第一个要交换的下标
j 参数,第二个要交换的下标
如果下标小于0,则-1代表最后一个元素(即ubound(arr) ),-2代表倒数第二个元素
如果下标大于数组的最大上标,如果下标值无效,不进行交换。
**返回值**
无返回值,直接在数组上进行修改
**举例**
```brush:vb
dim arr,dict,items,ret
arr = array(1,2,3)
set dict = D_
dict("test") = "obj"
'最后一个元素添加的是Dictionary对象
POP_MVC.Arr.push arr,dict
'交换第1个与最后一个
call POP_MVC.Arr.Swap( arr, 0 , -1) '[{"test":"obj"}, 2, 3, 1]
```
## 取片段函数
取片段函数有两个:Slice、Unique、Filter。这两个函数都不会直接修改原数组,而是返回一个新数组。
### Slice 函数
**功能**
从数组中取出一段
**参数说明**
Function Slice( ByRef arr, ByVal offset,ByVal length )
arr 参数,待操作数组
offset 参数,起始下标
length 参数,取出长度
**返回值**
如果给出了 length 并且为正,则序列中将具有这么多的单元。如果给出了 length 并且为负,则序列将终止在距离数组末端这么远的地方。
**举例**
```brush:vb
dim arr,ret
arr = array("a","b","c","d","e")
'从第2个元素开始,取2个元素
ret = POP_MVC.Arr.Slice(arr,1,2) '["b", "c"]
'从第3个元素开始取到最后一个
ret = POP_MVC.Arr.Slice(arr,2,-1) '["c", "d", "e"]
'从第3个元素开始取100个元素,显然没这么多,那么取到最后一个为止
ret = POP_MVC.Arr.Slice(arr,2,100) '["c", "d", "e"]
```
### Unique 函数
**功能**
移除数组中重复的值并将剩余的值返回一个数组(原数组不变)
**参数说明**
Function Unique( ByRef arr )
arr 参数,待操作数组
**返回值**
返回一个新数组
**举例**
```brush:vb
dim arr,ret,dict
'arr = array(1,2,"a","b","A","B","1","2",1,2)
'剔除了重复元素1、2
ret = POP_MVC.Arr.Unique(arr) '[1, 2, "a", "b", "A", "B", "1", "2"]
arr = array(1,#2007-10-10#,1,2,#2007-10-10#)
'如果有日期对象,可以正常使用
ret = POP_MVC.Arr.Unique(arr) '[1, "2007\/10\/10", 2]
set dict = D_
dict.add "test","obj"
arr = array(1,2,dict,1,2,dict)
'如果有Dictionary对象,则不能正常使用
ret = POP_MVC.Arr.Unique(arr) '不会得到任何结果,结果为Variant()
```
### Filter 函数
**功能**
用回调函数过滤数组中的单元
**参数说明**
`Function [Filter]( Byref input, Byref callback )`
input 参数,待操作数组
callback 参数,回调函数
依次将 input 数组中的每个值传递到 callback 函数。如果 callback 函数返回 TRUE,则 input 数组的当前值会被包含在返回的结果数组中。
**返回值**
返回符合过滤条件的新数组,如果没有符合条件的值时,返回空数组。
**举例1**
```brush:vb
'原生的filter函数也可以实现过滤功能
'返回下标从零开始的数组,其中包含以特定过滤条件为基础的字符串数组的子集
dim arr,ret
arr = array( "过滤cc","dd" , "过滤ee","abcd" )
ret = Filter(arr,"过滤") '["过滤cc", "过滤ee"]
ret = Filter(arr,"过滤",false) '["dd", "abcd"]
```
**举例2**
```brush:vb
'定义过滤函数
Function includeFunc( item )
if POP_MVC.String.Exists(item,"过滤") Then
includeFunc = true
else
includeFunc = false
end if
End Function
```
```brush:vb
'POP_MVC.Arr.Filter也可以实现原生Filter的功能
dim arr,ret
arr = array( "过滤cc","dd" , "过滤ee","abcd" )
ret = POP_MVC.Arr.Filter(arr,"includeFunc") '["过滤cc", "过滤ee"]
```
**举例3**
```brush:vb
'定义过滤函数
Function FilterFunc( item )
if DateDiff( "s", "2013-10-1" , item(2) ) > 0 then
FilterFunc = True
else
FilterFunc = False
end if
End Function
```
```brush:vb
'使用 POP_MVC.Arr.Filter 函数对一维数组可以实现更为复杂的过滤,自不必说
'现在来看,如何使用它对二维数组进行过滤
dim arr,ret
arr = array( _
array("1","a","2011-3-4") , _
array("2","b","2010-4-5") , _
array("3","c","2014-1-1") , _
array("4","d","2016-8-16") _
)
ret = POP_MVC.Arr.Filter(arr,"filterFunc") '[[3, "c", "2014-1-1"], [4, "d", "2016-8-16"]]
```
## 查找函数
### Exists 函数
**功能**
判断某个值是否存在于数组中,返回True或者False
**参数说明**
Function Exists( ByRef arr,ByRef val )
arr 参数,待查找数组
val 参数,待查找的值,只能是标量,或者可以通过=来判断相等的对象
**返回值**
存在返回True,不存在返回False
**举例**
```brush:vb
dim arr,ret
arr = array(1,2,3,"a","b","c")
ret = POP_MVC.Arr.Exists(arr,3) ' True
ret = POP_MVC.Arr.Exists(arr,11) ' False
```
### Search 函数
**功能**
在数组中搜索给定的值,如果成功则返回相应的键名,否则返回-1
**参数说明**
Function Search(ByRef arr,ByRef val)
arr 参数,待查找数组
val 参数,待查找的值,只能是标量,或者可以通过=来判断相等的对象
**返回值**
存在返回下标值,不存在返回-1
**举例**
```brush:vb
dim arr,ret
arr = array(1,2,3,"a","b","c")
'查找值3,存在,且下标为2
ret = POP_MVC.Arr.Search(arr,3) ' 2
'查找值11,不存在,返回-1
ret = POP_MVC.Arr.Search(arr,11) ' -1
```
## 迭代函数
迭代函数会将每一次迭代得到的结果会作为下一次迭代的初始值,不断逼近所需要的结果。POPASP提供了两个迭代函数:Product、Reduce
### Product 函数
**功能**
计算数组中所有值的乘积
**参数说明**
Function Product( ByRef arr )
arr 参数,待操作数组
**返回值**
返回一个数值
**举例**
```brush:vb
dim arr,ret
arr = array(1,2,3,"a","b","c",4,5)
'将数组中的数值元素1、2、3、4、5进行相乘
ret = POP_MVC.Arr.Product(arr) ' 120
```
Product函数只是简单的将数组中的数值迭代相乘。而这并不能满足个性个需求,如果可以通过自定义的函数将数组中的元素进行迭代,那多棒啊,不负你,POPASP有这样的函数Reduce
### Reduce 函数
**功能**
用回调函数迭代地将数组简化为单一的值
**参数说明**
Function Reduce( ByRef arr,ByRef func, ByRef initial)
arr 参数,待迭代数组
func 参数,迭代函数的函数名
initial 参数,初始值
**返回值**
返回一个数值或字符串
**举例**
```brush:vb
'迭代函数
Function reduceFunc( a,b )
if isNumeric(a) and isNumeric(b) then
reduceFunc = a + b * b
elseif isNumeric(a) then
reduceFunc = a * a
elseif isNumeric(b) then
reduceFunc = b * b
end if
End Function
```
```brush:vb
'使用迭代函数
dim arr,ret
arr = array("a","b","c",1,2,3)
'ret = 1 + 1*1 + 2*2 + 3*3
ret = POP_MVC.Arr.Reduce(arr,"reduceFunc",1) ' 15
'不要初始值
'ret = 1*1 + 2*2 + 3*3
ret = POP_MVC.Arr.Reduce(arr,"reduceFunc",null) ' 14
```
## 排序函数
POPASP提供了丰富的排序函数,有sort、rsort、casesort、casersort、natsort、natrsort、casenatsort、casenatrsort。另外还有个采用自定义函数进行排序的函数,为AscSortByFunc、DescSortByFunc
这么多排序函数,掌握了规律,也很记忆。
先看sort、rsort、casesort、casersort、natsort、natrsort、casenatsort、casenatrsort这几个函数。它们都直接操作数组本身,无返回值。我们以sort为例,来进行讲解
### sort 函数
**功能**
将字符串数组进行升序排序
**参数说明**
sub sort( ByRef arr )
arr 参数,待排序数组
如果两个比较元素同为日期型,则最新的日期值>较早的日期值
如果两个比较元素同为数值型,则比较数值大小
其他值的比较按字符串比较,使用了POP_MVC.String.cmp进行比较
**返回值**
无返回值,直接在传入的数组参数上进行排序
**举例**
```brush:vb
dim arr
arr = array("a","b","c",1,2,3,"2016-3-1",#2015-4-2#)
call POP_MVC.Arr.sort(arr) '[1, 2, "2015\/4\/2", "2016-3-1", 3, "a", "b", "c"]
```
通过sort函数,可以发现,这组排序函数,都只有一个参数,即待排序的数组,都为sub过程,没有返回值。排序操作直接作用在传入的数组身上。为了说明问题,我们再来看一个。
### natsort 函数
**功能**
用“自然排序”算法对数组升序排序
**参数说明**
sub natsort( ByRef arr )
arr 参数,待排序数组
如果两个比较元素同为日期型,则最新的日期值>较早的日期值
如果两个比较元素同为数值型,则比较数值大小
其他值的比较按字符串比较,使用了 POP_MVC.String.natcmp 进行比较
**返回值**
无返回值,直接在传入的数组参数上进行排序
**举例**
```brush:vb
dim arr
'arr数组中有一些文件名,将该文件名进行排序
arr = array("image1.jpg","image5.jpg","image10.jpg","image30.jpg")
call POP_MVC.Arr.sort(arr) '["image1.jpg", "image10.jpg", "image30.jpg", "image5.jpg"]
'使用sort函数,并不会得到我们想要的结果,须用natsort
call POP_MVC.Arr.natsort(arr) '["image1.jpg", "image5.jpg", "image10.jpg", "image30.jpg"]
```
通过上面的例子,已经将问题说明白,没有必要将每个函数再一一做演示。下面给出这些函数的功能。
| 排序函数 | 采用的比较方法 | 功能 |
| -------- | ----- | ---- |
| sort | POP_MVC.String.cmp | 将字符串数组进行升序排序 |
| rsort | POP_MVC.String.cmp | 将字符串数组进行降序排序 |
| casesort | POP_MVC.String.casecmp | 将字符串数组进行升序排序,并且忽略大小写 |
| casersort | POP_MVC.String.casecmp | 将字符串数组进行降序排序,并且忽略大小写 |
| natsort | POP_MVC.String.natcmp | 用“自然排序”算法对数组升序排序 |
| natrsort | POP_MVC.String.natcmp | 用“自然排序”算法对数组降序排序 |
| casenatsort | POP_MVC.String.casenatcmp | 用“自然排序”算法对数组升序排序,并且忽略大小写 |
| casenatrsort | POP_MVC.String.casenatcmp | 用“自然排序”算法对数组降序排序,并且忽略大小写 |
上面这么多排序函数,在程序内部,升序排序都使用了函数POP_MVC.Arr.AscSortByFunc函数,降序排序都使用了函数POP_MVC.Arr.DescSortByFunc。比如,我们来看sort函数的源码
```brush:vb
sub sort( ByRef arr )
call AscSortByFunc( arr , "POP_MVC.String.cmp")
end sub
```
再比如,我们来看natsort的源码
```brush:vb
sub natrsort( ByRef arr )
call DescSortByFunc( arr , "POP_MVC.String.natcmp")
end sub
```
在函数内部,均一行代码就实现了函数功能。这得归功于POP_MVC.Arr.AscSortByFunc与POP_MVC.Arr.DescSortByFunc函数。而这两函数,是通过私有方法sortByFunc来实现的。
```brush:vb
'按自定义函数进行升序排序
Public Sub AscSortByFunc( ByRef arr , ByRef callback )
call sortByFunc( arr , callback ,false )
End Sub
```
```brush:vb
'按自定义函数进行降序排序
Public Sub DescSortByFunc( ByRef arr , ByRef callback )
call sortByFunc( arr , callback ,true )
End Sub
```
这些排序函数还有一个特点,在刚才的示例中,可以看到,它们不仅可以对字符串进行排序,而且还可以对数值型、日期型元素进行排序。如果仅仅想通过字符串排序,而不想对这两种类型数据进行排序,可以使用两个属性来关闭。
```brush:vb
'sortByDate默认值是True
POP_MVC.Arr.sortByDate = Fasle
'sortByNumeric默认值是True
POP_MVC.Arr.sortByNumeric = Fasle
```
一般来说,数组中的元素都是同一种类型,如果不同类型的数据在一个数组中排序意义不大,如果数组中有对象类型的数据(非日期对象),则不能进行正常排序。
上面的排序函数,基本已经满足需求。如果想进行个性化的排序,那么就要使用usort函数。
### usort 函数
**功能**
按用户自定义函数进行排序
**参数说明**
Sub usort( ByRef arr,ByRef cmpFunc )
arr 参数,待操作数组
cmpFunc 参数,回调函数
本函数将用用户自定义的比较函数对一个数组中的值进行排序。如果要排序的数组需要用一种不寻常的标准进行排序,那么应该使用此函数。
比较函数必须在第一个参数被认为小于,等于或大于第二个参数时分别返回一个小于,等于或大于零的整数。
**返回值**
无返回值,直接在传入的数组参数上进行排序
**举例**
```brush:vb
'定义排序函数
Function sortFunc( item )
sortFunc = DateDiff( "s", "2013-10-1" , item(2) )
End Function
```
```brush:vb
'使用 POP_MVC.Arr.usort 函数对一维数组可以实现更为复杂的排序,自不必说
'现在来看,如何使用它对二维数组进行排序
dim arr,ret
arr = array( _
array("1","a","2011-3-4") , _
array("2","b","2010-4-5") , _
array("3","c","2014-1-1") , _
array("4","d","2016-8-16") _
)
'[[2, "b", "2010-4-5"], [1, "a", "2011-3-4"], [3, "c", "2014-1-1"], [4, "d", "2016-8-16"]]
ret = POP_MVC.Arr.usort(arr,"sortFunc")
```
## 其他函数
### Shuffle 函数
**功能**
将数组打乱
本函数打乱(随机排列单元的顺序)一个数组
**参数说明**
Sub Shuffle (ByRef arr)
arr 参数,待操作数组
**返回值**
无返回值,直接在传入的数组参数上进行操作
**举例**
```brush:vb
dim arr
arr = array("a","b","c","d")
'每次打乱后的结果都不一样
call POP_MVC.Arr.Shuffle(arr) '["c", "b", "a", "d"]这是其中之一
```
### Merge 函数
**功能**
将两个数组合并
将第二个数组追加到第二个数组的末尾
**参数说明**
Function Merge( ByRef arr1,ByRef arr2 )
arr1 参数,待操作数组一
arr2 参数,待操作数组二
**返回值**
返回合并后的数组
**举例**
```brush:vb
dim arr1,arr2,arr
arr1 = array("a","b","c")
arr2 = array("c","d","e")
arr = POP_MVC.Arr.Merge(arr1,arr2) '["a", "b", "c", "c", "d", "e"]
```
### toDict 函数
**功能**
将数组转化成Dictionary对象
**参数说明**
Function toDict( ByRef arr )
arr 参数,待操作数组
**返回值**
返回Dictionary对象
**举例**
```brush:vb
dim arr,dict
arr = array("a","b","c")
set dict = POP_MVC.Arr.toDict(arr) '{"0":"a", "1":"b", "2":"c"}
```
### Map 函数
**功能**
将回调函数作用到给定数组的单元上,并返回一个新数组
**参数说明**
Function Map( ByRef arr,ByRef callback )
arr 参数,待操作数组
callback 参数,回调函数
**返回值**
返回一个新数组
**举例**
```brush:vb
'定义回调函数
Function mapFunc(item)
mapFunc = item & "-" & item
End Function
```
```brush:vb
dim arr,ret
arr = array("a","b","c")
ret = POP_MVC.Arr.Map(arr,"mapFunc") '["a-a", "b-b", "c-c"]
```
### Reverse 函数
**功能**
返回一个单元顺序相反的数组
**参数说明**
Function Reverse( ByRef arr )
arr 参数,待操作数组
如果传入的不是数组或者长度为0的数组,均返回Array(),如果只含一个元素的数组,则原样返回。
其他情况都会正常反转数组
**返回值**
返回一个单元顺序相反的数组
**举例**
```brush:vb
dim arr,ret
arr = array("a","b","c","d")
ret = POP_MVC.Arr.Reverse(arr) '["d", "c", "b", "a"]
```