【问题标题】:Lodash Map with mulitvariable function具有多变量功能的 Lodash 地图
【发布时间】:2015-05-17 14:30:35
【问题描述】:

是否可以使用 lodash 遍历集合并将项目传递给需要两个(或更多)参数的函数?在以下示例中,该函数应采用两个值并将它们相加。该地图应采用一个数组并为每个数组添加 10。以下是我认为它的工作原理:

function x (a, b) {
    return a + b
}

var nums = [1, 2, 3]
console.log(_.map(nums,x(10)))
--->ans should be [11, 12, 13]
--->actually is [ undefined, undefined, undefined ]

【问题讨论】:

  • 部分申请,_.map(nums, x.bind(null, 10)),或咖喱x

标签: javascript lodash


【解决方案1】:

您在这里实际上要做的是“咖喱”x 函数,lodash 通过curry() 支持该函数。柯里化函数是一次可以接受一个参数的函数:如果您不提供完整的参数集,它会返回一个期望剩余参数的函数。

这是柯里化的样子:

function x(a,b) {
    return a + b;
}
x = _.curry(x);  //returns a curried version of x

x(3,5); //returns 8, same as the un-curried version

add10 = x(10);
add10(3); //returns 13

所以你的原始代码非常接近咖喱版本:

console.log(_.map([1,2,3], _.curry(x)(10))); //Prints [11,12,13]

(正如对该问题的评论中指出的那样;Function.prototype.bind 也可用于柯里化,但如果您已经在使用 lodash,那么您不妨使用特定于任务的东西)

【讨论】:

    【解决方案2】:

    你可以这样做:

    var numbers = [1, 2, 3];
    
    function x(value, number) {
        return value + number;
    }
    
    console.log(_.map(numbers, function(value) { return  x(value, 10) }));
    

    【讨论】:

      【解决方案3】:

      当然,关闭很棒!只需创建一个“关闭”(包装)x 函数并将 10 作为其第二个参数的函数。

      function x (a, b) {
        return a + b;
      }
      
      function addTen (number) {
        return x(numberToAddTo, 10);
      }
      
      var nums = [1, 2, 3];
      
      console.log(_.map(nums, addTen));
      

      【讨论】:

      • 您似乎没有将generateAdder 的参数传递给内部函数。
      • 是的,我最初写它是为了让您可以输入数字,但为了简单起见,删除了最后一分钟。错过了10.. 谢谢。
      • 那么你可能会问自己,如果你根本不修改内部函数,为什么需要外部函数来生成它?
      • 呸……哈哈,我很快就写好了。晚了。我累了。 。谢谢:)
      • 老实说,我只会使用.bind...但是在学习时最好从这种事情开始,如果他理解范围足以使用@987654326,OP就不会问这个问题@
      猜你喜欢
      • 1970-01-01
      • 2019-11-07
      • 1970-01-01
      • 2019-03-18
      • 1970-01-01
      • 1970-01-01
      • 2021-01-29
      • 1970-01-01
      • 2016-10-18
      相关资源
      最近更新 更多