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

Best way to do a non-mutating inverse tail in javascript using Underscore/Lodash

我在我的 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/underscore 样式的函数库一起使用,或者这只是吹毛求疵?

提前致谢,对于我的问题中任何明显的遗漏或错误,我们深表歉意。

何必underscore/lodash。

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

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

使用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];