此代码:
_(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);
}));
});
});
答案 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(...
不一样。两个可能的修复:
删除方法名称和左括号之间的空格:
_(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)
您还可以删除调用_.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,你很高兴。