关于 aardio 中 table 操作函数的注意事项

光庆 2天前 211

早期版本中, {1,2,3} 是一个表,也视为数组。 

近期版本中,将数组进行了细分, 加入了“纯数组”、“类数组”的概念。 

然后,{ 1,2,3 } 不再是以前定义的“数组”,而是成了“类数组”。

也就是说,这是一个包含稠密数组成员的“表”(用 “#” 操作符取到非零长度)。

而纯数组,指的是起始索引为 1 的稠密数组,用 [ ] 表示,如 [ 1,2,3 ] 

因此,以前很多操作数组的函数,因为 { } 不再是 “(纯)数组” 而导致执行结果错误。 

比如: 

var t = { {"张三"}, {"李四"}, {"王五"}, {"SSS"}, {"AAA"}} 
var r = table.flat(t) 
console.dump(r)

在早期版本中,执行结果是 : 

 { [1]=“张三”; [2]=“李四”; [3]=“王五”; [4]=“SSS”; [5]=“AAA” } 

也就是: 

 {“张三”,“李四”,“王五”,“SSS”,“AAA”} 

而新版本中,执行结果成了: 

 [{[1]=“张三”},{[1]=“李四”},{[1]=“王五”},{[1]=“SSS”},{[1]=“AAA”}] 

明显不是我们想要的结果。

所以,要注意,很多table操作函数,都改为针对 纯数组 操作了,以前的一对 { } 打天下的日子过去了。

我们拿 flat 函数做例子,近期版本的正确用法如下:

 //使用纯数组 
var t = [["张三"], ["李四"], ["王五"], ["SSS"], ["AAA"]] 
var r = table.flat(t) //不改变原值t 
console.dump(r)

然后,我们模拟一下早期版本处理 { } 的效果:

//使用类数组
var t = { {"张三"}, {"李四"}, {"王五"}, {"SSS"}, {"AAA"}}
var r = table.append({},table.unpack(t)) //不改变原值t
console.dump(r)

var t = { {"张三"}, {"李四"}, {"王五"}, {"SSS"}, {"AAA"}}
var r = table.map(t,λ(v)v[1]) //不改变原值t
console.dump(r)

var t = { {"张三"}, {"李四"}, {"王五"}, {"SSS"}, {"AAA"}}
var r = reduce(t,lambda(r,v)table.append(r,v),{}) //不改变原值t
console.dump(r)

var t = { {"张三"}, {"李四"}, {"王五"}, {"SSS"}, {"AAA"}}
var r = reduce(t,function(t,v,i){t[i]=v[1];return t;},{}) //不改变原值t
console.dump(r)

var t = { {"张三"}, {"李四"}, {"王五"}, {"SSS"}, {"AAA"}}
table.some(t,function(v,k){t[k]=v[1];}) //改变原值t
console.dump(t)

var t = { {"张三"}, {"李四"}, {"王五"}, {"SSS"}, {"AAA"}}
for(i=1;#t;1){ t[i]=t[i][1]} //改变原值t
console.dump(t)


最新回复 (3)
  • breezee 2天前
    0 2

  • Mr_MAO 2天前
    0 3
    👍🏻学习了!
  • mfk 1天前
    0 4

返回