早期版本中, {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)