使用Underscore / Lodash在javascript中进行非变异反尾的最佳方法

时间:2015-01-02 02:37:56

标签: javascript node.js recursion underscore.js

我在我的node.js项目中是lodash / underscore的狂热用户,我发现自己处于这样一种情况:我需要以类似于下面代码的方式从右到左递归迭代一个数组(假设所有调用都是同步的:

function makeDir(pathArray) {
  var unsulliedPath = clone(pathArray);
  var lastGuy = pathArray.pop();
  var restOfEm = pathArray;
  if dirExists(unsulliedPath) {
    console.log("Your job is done!");
  } else {
    makeDir(restOfEm);
    makeDir(unsulliedPath);
  }
}

然而,必须克隆并改变pathArray参数会让我感到困惑。所以我可以这样做:

function makeDir(pathArray) {
  var lastGuy = _.last(pathArray);

  // EITHER I could...
  var restOfEm = _(pathArray).reverse().tail().reverse().value(); 
  // OR I could do...
  var restOfEm = _.first(pathArray, pathArray.length - 1);

  if dirExists(pathArray) {
    console.log("Your job is done!");
  } else {
    makeDir(restOfEm);
    makeDir(pathArray);
  }
}

好吧,这需要克隆传入的参数。但是,下划线的咒语有点难看。

lodash / underscore是否包含一个更简单,更清晰的方法来获取_.rest()的反转,即除了最后一个元素之外的每个元素?如果没有,是否有一个首选的惯用解决方案,用于在Javascript中实现此方法以与lodash /下划线样式的函数库一起使用,或者这只是简单的挑选?

提前致谢,并对我的问题中的任何明显遗漏或错误道歉。

2 个答案:

答案 0 :(得分:3)

为什么要打扰下划线/ lodash。

var last = pathArray.slice(-1)[0];
var rest = pathArray.slice(0, -1);

slice会很容易地为你完成这一切......

答案 1 :(得分:0)

使用Array.splice https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice如果您不想修改原始文件,请执行Array.slice复制原始文件,然后复制Array.splice。

即:

var rest = pathArray.slice(0);
var last = rest.splice(-1, 1)[0];