A:在一些编程场景中,我们可能用到t[:,:]:=R;方式对R进行重构处理,比如重构行列下标等,一般情况下这种是可以实现的。
但是也存在一些特殊情况,该种方式可能会产生隐晦的错位问题。
如:源数据可能通过各种过程产生,其每行数据的每列赋值顺序可能不一样,导致最终数据源码如下:
存在个别行中列的实际存储顺序与其它行的顺序不一样
R:=array("6.51":("price":6.51,"volumn":63700),
"5.99":("price":5.99,"volumn":17000),
"6.07":("volumn":20000,"price":6.07)
);
该数据在客户端中显示如:行列对齐,完全看不出差异,做正常的数组操作运算也没有任何问题
但是在通过t[:,:]:=R;方式对该数据进行重构时(原目的是为了去掉行下标),产生列数据错位,展示如下:
R:=array("6.51":("price":6.51,"volumn":63700),
"5.99":("price":5.99,"volumn":17000),
"6.07":("volumn":20000,"price":6.07));
t := zeros(mrows(R),mcols(R,1));
t[:,:]:=R;
return t;
结果如下:第三行的两列数据明显已经错位
原因:天软中数组的数据按行进行存储,R记录的是数据最源始的存储状态,在通过t[:,:]方式赋值时,已经是不考虑t与R下标是否对应的关系,只是将R的元素按位置顺序赋值给t了,所以产生了这种错误效果。
那么,对于这种场景我们应该怎么避免呢?
建议在重构时,我们选择以下方式进行:
示例1:利用ReIndex2函数修改数组行标或列标为自然数字
ReIndex2函数说明:FAQ:
ReIndex2
R:=array("6.51":("price":6.51,"volumn":63700),
"5.99":("price":5.99,"volumn":17000),
"6.07":("volumn":20000,"price":6.07));
return ReIndex2(R,1);
返回结果:
示例2:对源数据按指定列顺序进行重构后再进行该类操作
R:=array("6.51":("price":6.51,"volumn":63700),
"5.99":("price":5.99,"volumn":17000),
"6.07":("volumn":20000,"price":6.07));
R:=R[:,array("price","volumn")];//按指定列顺序重构
t := zeros(mrows(R),mcols(R,1));
t[:,:]:=R;
return t;
返回结果:
