如果开发RIA或者使用Node.js做后台开发,大量的数组操作则变得很常见。然而传统的JavaScript库在操作数组时,往往会多次遍历并产生临时数组,这将大大影响性能。如果你正在为这样的事情而担忧,Lazy.js正是你的大救星。

如何使用

Lazy.js最大的好处在于可以将一连串针对数组的操作,惰性计算,只进行一次遍历。考虑这样的例子:

var result = _.chain(array).map(square).map(inc).filter(isEven).take(5).value();

这段使用underscore的一连串函数调用,每一步都会对原数组产生一个临时副本,下一步的函数实际上是针对临时副本的,因此整个过程下来,不但要对数组遍历多次,而且还要产生许多副本。

对性能敏感的开发者,可能会自己用循环写出只遍历一次的版本:

var results = [];
for (var i = 0; i < array.length; ++i) {
  var value = (array[i] * array[i]) + 1;
  if (value % 2 === 0) {
    results.push(value);
    if (results.length === 5) {
      break;
    }
  }
}

看起来高效多了,但这段代码难以复用,多次修改后如果不妥善增加注释,也会让其他人不易理解。

然而如果用Lazy.js的话:

var result = Lazy(array).map(square).map(inc).filter(isEven).take(5);

和underscore的版本如出一辙,但是直到最后的take之前,都不会有数组生成!换句话说,除非我们需要结果,否则就不进行大规模的计算。这个思想在函数式编程中很常见,现在终于也可以在JavaScript中轻松地使用了。

我没有对Lazy.js做实际的研究和使用,但目前它还提供了异步计算、DOM事件代理、字符串操作以及流处理的相关接口,相信会对RIA及Node.js开发者有所帮助。

许可证

Lazy.js使用MIT协议进行开源。

About liuyanghejerry

富有激情的前端工程师,专注GUI开发。

One Thought on “数组操作的福星 – Lazy.js

  1. underscore里面也有这样的封装

Post Navigation