2014-02-06 58 views
3

此代码:为什么我无法链接这一系列的lodash调用?

_(gameState.loot) 
    .pick((value, key) -> key isnt "pickUpAnimations") 
    .filter ((d) -> _.isArray (d)) 
    .reduce ((sum, d) -> sum.concat (d)) 

是给我这个错误:

TypeError: 'undefined' is not a function (evaluating '(function(d) { 

鉴于此代码工作正常:

removedAnimations = _.pick(gameState.loot, (value, key) -> key isnt "pickUpAnimations") 
    removedAnimations = _.filter removedAnimations, ((d) -> _.isArray (d)) 
    removedAnimations = _.reduce removedAnimations, ((sum, d) -> sum.concat (d)) 
    removedAnimations 

对我来说,似乎这些应该做同样的事情。的gameState.loot架构是这样的:

loot: { 
    ttl: 6000 
    slowBlinkWhenTtlLessThanPercent: 60 
    fastBlinkWhenTtlLessThanPercent: 30 
    resurrections: [] 
    gold: [] 
    health: [] 
    equipment: [] 
    pickUpAnimations: [] 
} 

顺便说一句,这是第一个例子中所产生的JavaScript:

return _(gameState.loot).pick(function(value, key) { 
    return key !== "pickUpAnimations"; 
}).filter((function(d) { 
    return _.isArray(d); 
}).reduce((function(sum, d) { 
    return sum.concat(d); 
}))); 

我试图@这个Blender的建议:

_(gameState.loot) 
    .pick (value, key) -> key isnt "pickUpAnimations" 
    .filter (d) -> _.isArray (d) 
    .reduce (sum, d) -> sum.concat (d) 

但是,这给了我这个错误:

>> TypeError: 'undefined' is not a function (evaluating '"pickUpAnimations".filter(function(d) { 

这里的JavaScript的样子:

return _(gameState.loot).pick(function(value, key) { 
    return key !== "pickUpAnimations".filter(function(d) { 
    return _.isArray(d.reduce(function(sum, d) { 
     return sum.concat(d); 
    })); 
    }); 
}); 
+0

不知道是什么问题,但你可以删除一些括号https://gist.github.com/elclanrs/8838052 – elclanrs

回答

9

这里有更好的压痕生成的JavaScript:

_(gameState.loot).pick(function(value, key) { 
    return key !== "pickUpAnimations"; 
}).filter(
    (function(d) { 
     return _.isArray(d); 
    }).reduce((function(sum, d) { 
     return sum.concat(d); 
    })) 
); 

正如你所看到的,.filter (....filter(...是不一样的。两种可能的解决方法:

_(gameState.loot) 
    .pick((value, key) -> key isnt "pickUpAnimations") 
    .filter((d) -> _.isArray (d)) 
    .reduce((sum, d) -> sum.concat (d)) 
  • 删除括号完全:

    _(gameState.loot) 
        .pick (value, key) -> key isnt "pickUpAnimations" 
        .filter (d) -> _.isArray (d) 
        .reduce (sum, d) -> sum.concat (d) 
    
  • 您还可以得到

    1. 方法名和左括号之间取出空白摆脱匿名函数_.isArray

      _(gameState.loot) 
           .pick (value, key) -> key isnt "pickUpAnimations" 
           .filter _.isArray 
           .reduce (sum, d) -> sum.concat (d) 
      
    +0

    我正在查看生成的代码相比,我在上面的评论和是,这是确实是这个问题。 – elclanrs

    +0

    这个错误以不同的方式给我。请参阅我的问题中的编辑。 –

    +0

    感谢您的帮助,并在javascript中看到,我意识到我没有像以前那样使用Coffeescript 1.7.1。我不得不更新我的grunt-contrib-coffeescript插件。 –

    2

    阴暗面的CoffeeScript的:

    _(gameState.loot).pick(function(value, key) { 
        return key !== "pickUpAnimations"; 
    }).filter((function(d) { 
        return _.isArray(d); 
    }).reduce((function(sum, d) { 
        return sum.concat(d); 
    }))); 
    

    注意额外(您的过滤回调之前。发生了什么是你打电话:

    (function(d) { return _.isArray(d); }).reduce(... 
    

    哪个会失败。修好你的卷发,你很好走。

    相关问题