-
1505121235 数据老手Lv5
发表于2019-9-29 21:31
楼主
简介
在表达式中经常会用到数组对象,例如:
一维数组: [1,2,3,4]
二维数组: [[1,2,3],[2,3,4]]
当然表达式中也可以通过其它途径获得数组对象,比如ardb函数,或者是报表模板中的数据源等,数组对象有下列属性和方法
属性:
名称 | 描述 |
size或者length | 返回数组的长度 |
取数组元素:
使用中括号[]来索引数组元素, []里面填索引序号,获取相应的数组成员(元素)。
形如:A2$=[3,5,8,7]
举例 | 返回值 | 说明 |
[3,5,8,7][2] | 8 | 取数组的第3个元素 |
A2$[1] | 5 | 取A2$数组的第2个元素 |
A2$[-1] | 7 | 取A2$数组的最后一个元素 |
A2$[-2] | 8 | 取A2$数组的倒数第二个元素 |
注意:
1.为了提高易用性,当索引为负数时,含义是倒序取数组元素。但负数太小(加上数组长度仍为负数)时,返回null。
2.当索引值越界后,为了友好性,不直接报越界错误,返回null。正向边界是数组长度(不包括),逆向边界是负的数组长度(包括)。
数组方法:
名称 | 适用对象 | 参数 | 示例 | 描述 |
sum() | 一维数值型数组 | 无 | [1,2].sum()返回3 | 求一维数值型数组的所有元素的和 |
avg() | 一维数值型数组 | 无 | [1,2].avg()返回1.5 | 求一维数值型数组的所有元素的平均值 |
min() | 一维数组 | 无 | ['a','b'].min()返回a | 求一维数组的所有元素中的最小值 |
max() | 一维数组 | 无 | [1,2].max()返回2 | 求一维数组的所有元素中的最大值 |
join(sep,acceptNull) | 全部数组 | sep:分隔符(必须) acceptNull:是否接受空值(可选) | [1,2].join(',')返回1,2 [1,6,8,null,"abc","""","\"\""].join(",",true) 返回1,6,8,,abc,,,"" | 将数组中的每个元素连接起来,每个元素之间用指定的分隔符分割,返回连接后的字符串,如果有第2个参数且 为true那么将使用空串替换其中的null值和空值,否则忽略(不加入到结果中) |
select(filter,itemproc) | 全部数组 | filter:传递一个条件过滤表达式,表达式中 可以使用@符号引用当前的数组元素(必须) itemproc:传递一个节点处理表达式,表达式中 可以使用@符号引用当前的数组元素(可选) | [1,2,3].select(@>1)将返回[2,3] [[1,2],[2,3],[3,4]].select(@[0]>1,@[1]).join(';')返回3;4 | 根据指定的过滤条件表达式过滤数组,将满足条件的元素形成一个新的数组返回 |
get(filter) | 全部数组 | filter:传递一个条件过滤表达式,表达式中 可以使用@符号引用当前的数组元素(必须) | [1,2,3].get(@>1)返回2 | 根据指定的过滤条件表达式过滤数组,返回满足条件的第一个元素 |
find(element) | 一维数组 | element:任意变量(必须) | ['a','b','c'].find('b')返回1 | 返回指定的参数在数组中的序号,大小写敏感,如果找不到返回-1 |
search(element) | 一维数组 | element:任意变量(必须) | ['a','b','c'].search('B')返回1 | 返回指定的参数在数组中的序号,大小写不敏感,如果找不到返回-1 |
mid(index,len) | 全部数组 | index:整型(必须) len:整型(可选) | ['a','b','c'].mid(1)返回['b','c'] ['a','b','c'].mid(0,2)返回['a','b'] | 返回指定的从数组第index个开始的长度为len的所有元素形成的一个行的数组 |
sort(asc) | 一维数组 | sort()=sort(false),默认是降序,sort(true)为升序 | 数组前三名: A2$.sort()[0].value A2$.sort()[1].value A2$.sort()[2].value 数组后三名: A2$.sort(true)[0].value A2$.sort(true)[1].value A2$.sort(true)[2].value | 返回排序后的新的数组 |
rank(element,asc) | 一维数组 | element:任意变量(必须) asc:true(升序),false(降序),不设默认降序 | ['e','b','a','c'].rank('a')返回4 ['e','b','a','c'].rank('a',true)返回1 | 返回指定的参数在数组中的排名 |
getcol(index) | 多维数组 | index:整型(必须) | [ [1,2,3] , [2,3,4] ].getcol(0)返回[1,2] | 对于多维数组,此函数返回多维数组中每一维数组的第index个元素所形成的一个新的数组 |
split(len) | 一维数组 | len:整型(必须) | [1,2,3,4].split(2) 返回 [[1,2],[3,4]] | 把一个一维数组分隔成多维数组,如[1,2,3,4].split(2) -> [[1,2],[3,4]] 用途:当一个表是交叉表时,如果要以二维数组的形式引用浮动出来的指标可以使用 B2$$.split(A2$.length) |
distinct() | 无 | [1,2,2,4].distinct() 返回[1,2,4] | 去掉数组中的重复项 |
数组加减
数组对象是支持加法和减法操作的,例如:
[1,2,3]+[4,5] 返回 [1,2,3,4,5]
[1,2,3]+4+5 返回 [1,2,3,4,5]
[1,2,3, 4]-[4,5] 返回 [1,2,3]
[1,2,3, 4]-4 返回 [1,2,3]
[1,2,3]+4+5 返回 [1,2,3,4,5]
[1,2,3, 4]-[4,5] 返回 [1,2,3]
[1,2,3, 4]-4 返回 [1,2,3]
补充:
1.浮动维表元浮动出来的值,也是一个数组,例如 C3$$,表示是表元C3浮动出来的值,对C3浮动出来的值进行排名,
C3$$.rank(C3)
SQL数据源也是一个数组对象,例如,报表模板中定义一个SQL数据源rs1 (select name, cost from xxxx),rs1就可以看作是一个二维数组对象。要对cost求和,rs1.getcol(1).sum()
2.表元数组的几种写法:
1、A1$:A1是浮动维表元,A1$是它浮动出来的所有实例
2、A1:A4:表元数组,含4个元素A1,A2,A3,A4
3、[A1,A2,A3,A4]:等价于A1:A4
4、A1:K4:表元数组,注意是一维的。
易混淆的写法:
1、[A1:A4]:这等价于[[A1,A2,A3,A4]],这是一个二维数组。
2、[A1$,B1$]:这是一个二维数组,数组中含2个元素,第一个元素是A1$,它也是一个数组。
3.合并两个一维数组,可以直接使用+号,例如:
(1..6)+(10..13) = [1,2,3,4,5,6,10,11,12,13]
4.数组行列转换用.matrix()或者math.transpose()
重要:
字符串可以通过split函数返回一个数组,如:
="a,b,c,e,f,z".split(",'')
分隔符为特殊字符时,要在分隔字符参数值前面加转义符"\"(实际使用时,发现没有按期望分隔字符串的字符加个\后再看效果)。
常见的特殊字符有:()|.+*[{^$?\
下拉维多选或下拉枚举多选时,计算结果表中可通过@paramname.value取到多选参数值,通常格式为
value1|value2|value3..
即用竖线作为分隔符。在BI中使用字符串.split分隔它时,"|"是一个特殊字符,需要在前面加个转义符"\",eg:@bwb.value="00|01",则
@bwb.value.split("\|")可得到已选参数值的数组格式,@bwb.value.split("\|").join(",")可修改其中的分隔符(|)为逗号(,)得到逗号分隔的普通串
split与join是一对数组与字符串转换的函数,split把符合格式要求的字符串拆分成数组对象,join把数组对象用指定连接符连接为字符串。