数组构造器。创建指定长度的数组;用填充物填充,默认为0;当初始值为数值时可以指定步长,即比上一元素多多少
注意区别于原生Array,如Array.isArray(),Array.from()等
去重。不改变原数组,返回去重后的数组。
对数组进行for循环,同步执行。表达式执行环境有当前循环的元素$x、下标$i、上层数据$p。
for()和excs()里可以使用break()函数终止循环。break()也只能终止这两个函数。
原生forEach的重写,异步执行。也是对数组进行循环,但不等待异步函数的执行结果。
原生map的重写。
原生filter的重写。
原生find的重写。
原生findLast的重写。
原生findIndex的重写。
原生findLastIndex的重写。
原生every的重写。
原生some的重写。
原生reduce的重写。
把当前循环的元素$x、下标$i、上次累加结果$acc、上层数据$p传给表达式;初始值默认为0。
原生sort的重写,直接改变原数组顺序。
A. 无表达式时同原生sort
B. 把表达式作为对象获取路径来取得值,根据取到的值来排序。前面加个负号-可以反序排序。
C. 如果表达式包含$a和$b字样则把上一数据项$a与当前数据项$b传给表达式,由表达式的执行结果来排序
D. 如果表达式表达式是个数组,则先取出表达式的第一个项来排序,如果比较结果为0(即相等)就继续取下一个表达式继续排序。每个表达式可以是B那样带有负号-的路径,也可以是C那样包含$a和$b的表达式。
如果想把空值(" ", undefined, null)排在后面,可以再传入一个布尔参数。A是第一个参数,C由表达式控制而无效。
更多原生数组函数可参考MDN文档
除了sort(),每个函数里的表达式执行环境都有$x、$i、$p,而reduce()还有$acc。
只有for()循环是同步执行的,即只有for里面的表达式才会等待异步函数/耗时任务(网络请求/数据库操作等)的执行结果,其它数组函数都是异步
上面的表达式参数都可以用箭头函数代替。比如财务系统费用明细报表中用到的表达式可以这么写:
凭证s.for('$v.期间s.push(年月); $v.金额[科目][年月] = 借方发生额')
凭证s.for(凭证 => ($v.期间s.push(凭证.年月); $v.金额[凭证.科目][凭证.年月] = 凭证.借方发生额))
科目s.for(`$v.期间s.for('$v.金额[$p.id][$x] = $p.末级科目.reduce("$acc + $v.金额[$x][$p.$x]")')`)
科目s.for(科目 => $v.期间s.for(期间 => $v.金额[科目.id][期间] = 科目.末级科目.reduce((累积值, 末级科目) => 累积值 + $v.金额[末级科目][期间])))表达式简洁,变量名有统一规范,但嵌套多了不好写匹配的引号,指向外层变量需要$p组合;
多次嵌套时函数更有优势,每一层都可以自定义变量名,不用引号嵌套。