Ramda.js - 切片阵列的内在价值

时间:2016-03-10 18:17:27

标签: javascript arrays functional-programming ramda.js

使用Ramda.js实现这一目标的最佳方法是什么?

function innerVals(array) {
  const lengthMinus1 = array.length - 1;
  return array.slice(1, lengthMinus1);
}

我似乎找不到一个好的方法来切片直到长度 - 1而不在某处存储该变量。我能想到的最好的就是使用Ramda的融合函数:

// innerVals :: Array -> Array
function innerVals(array) {
  // lengthMinus1 :: Array -> Number
  const lengthMinus1 = R.pipe(R.length, R.subtract(_, 1));

  // getVals :: Array -> Array
  const getVals = R.converge(
    R.slice(1, _, _),
    [lengthMinus1, R.identity]
  );

  return getVals(array);
}

我很难相信这是实现这样一个简单目标的干净方法。功能编程方法中的代码明显增多,而且我认为其他开发人员更难以阅读/维护。我错过了什么吗?如果有人有不同的方法,请告诉我。谢谢!

3 个答案:

答案 0 :(得分:4)

我建议R.slice

> R.slice(1, -1, [1, 2, 3, 4, 5])
[2, 3, 4]

> R.slice(1, -1)([1, 2, 3, 4, 5])
[2, 3, 4]

答案 1 :(得分:3)

Ramda具有函数init,它“返回除给定列表或字符串的最后一个元素之外的所有元素。”所以

 R.compose(R.init, R.tail)([1, 2, 3, 4, 5]); //=> [2, 3, 4]

您可以在 Ramda REPL

上看到这一点

答案 2 :(得分:1)

怎么样

innerVals = R.compose(
    R.drop(1),
    R.dropLast(1));

console.log(innerVals([1,2,3,4,5])) // [2,3,4]

或只是slice

innerVals = R.slice(1, -1)