为什么我不能连接这一系列的lodash电话?

时间:2014-02-06 03:34:08

标签: javascript coffeescript underscore.js 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: []
}

BTW,这是从第一个例子生成的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);
    }));
  });
});

2 个答案:

答案 0 :(得分: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(...不一样。两个可能的修复:

  1. 删除方法名称和左括号之间的空格:

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

    _(gameState.loot)
        .pick (value, key) -> key isnt "pickUpAnimations"
        .filter (d) -> _.isArray (d)
        .reduce (sum, d) -> sum.concat (d)
    
  3. 您还可以删除调用_.isArray的匿名函数:

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

答案 1 :(得分:2)

咖啡师的黑暗面:

_(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(...

哪个会失败。修复你的curlies,你很高兴。