花费越来越多时间学习JS,我喜欢它。然而,当我开始处理稍微复杂的功能(IIFE,匿名等)时 - 我开始挣扎,并且会喜欢一些指针。非常感谢所有的帮助和建议,解释为什么我的代码行(第15行)引起了如此多的悲痛!
分配说明如下:
到目前为止,我知道我已经正确设置了for循环,并且在调用实际函数时我在正确的轨道上,但我只是无法弄清楚循环中的最后一行。我意识到我需要使用数组移位方法才能顺序开始清空数组,但是,我不知道如何将输入参数应用于每个函数,将其作为输入存储,然后在我删除时继续循环返回结果之前的函数。
// The following array and 'start' variable are given (by the assignment):
var puzzlers = [
function(a) { return 8 * a - 10; },
function(a) { return (a - 3) * (a - 3) * (a - 3); },
function(a) { return a * a + 4; },
function(a) { return a % 5; }
];
var start = 2;
// My code begins below:
var applyAndEmpty = function(input,queue) {
for(var i = 0; i < queue.length; i++) {
input = queue[i].shift(); // This is my problem area - I simply don't understand!
}
return input;
};
alert(applyAndEmpty(start,puzzlers));
答案 0 :(得分:2)
通过这种语法,您在数组中的项目上调用shift
,而不是数组。所以不要这样:
input = queue[i].shift()
试试这个:
var func = queue.shift() //get the function from the array
input = func(input) //call the function, I'd recommend you don't overwrite your param, rather store to another var (helpful in debugging)
由于这是一项任务,我不会修复其余部分(教一个人钓鱼......),但作为一个提示,你应该存储你以前的答案,这样你就可以将其作为当前函数的参数。
答案 1 :(得分:2)
您需要使用您收集的输入执行该功能:
input = queue[i](input)
并且您不想使用.shift - 这是在循环中使用数组的另一种方式(它删除了数组中的“bottom”项 - 但它更改了原始数组,这可能会在其他地方产生副作用)。这有其用途,但它与for循环相冲突,这就是你被要求使用的东西。
编辑细分:
queue[i] -> the current function
queue[i]( -> it's a function, so run it...
queue[i](input) ->...with the previous output as input
编辑在评论中进行讨论
同时使用.shift和for循环(其中“在末尾有一个空队列”的要求似乎暗示)是相当奇怪的。通常你会在一段时间内使用shift
var input = initial_value;
var current_function;
while (current_function = queue.shift()) {
input = current_function(input);
}
我猜你可以使用for循环来模仿while循环
var current_function;
for (var input = INITIAL_VALUE; current_function = queue.shift(); ) {
....
但它没有意义。你可以在最后清空数组......
答案 2 :(得分:1)
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.mongodb.Mongo]: Factory method 'mongo' threw exception; nested exception is de.flapdoodle.embed.process.exceptions.DistributionException: java.io.EOFException: Unexpected end of ZLIB input stream
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
... 147 common frames omitted
Caused by: de.flapdoodle.embed.process.exceptions.DistributionException: java.io.EOFException: Unexpected end of ZLIB input stream
at de.flapdoodle.embed.process.runtime.Starter.prepare(Starter.java:65) ~[de.flapdoodle.embed.process-1.40.0.jar:na]
at cz.jirutka.spring.embedmongo.EmbeddedMongoBuilder.build(EmbeddedMongoBuilder.java:99) ~[embedmongo-spring-1.3.0.jar:1.3.0]
at pl.myapp.config.MongoConfiguration.mongo(MongoConfiguration.java:23) ~[test-classes/:na]
at pl.myapp.config.MongoConfiguration$$EnhancerBySpringCGLIB$$c24baf13.CGLIB$mongo$0(<generated>) ~[spring-core-4.1.6.RELEASE.jar:na]
at pl.myapp.config.MongoConfiguration$$EnhancerBySpringCGLIB$$c24baf13$$FastClassBySpringCGLIB$$fb7c7abc.invoke(<generated>) ~[spring-core-4.1.6.RELEASE.jar:na]
at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) ~[spring-core-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:309) ~[spring-context-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at pl.myapp.config.MongoConfiguration$$EnhancerBySpringCGLIB$$c24baf13.mongo(<generated>) ~[spring-core-4.1.6.RELEASE.jar:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_25]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_25]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_25]
at java.lang.reflect.Method.invoke(Method.java:483) ~[na:1.8.0_25]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
... 148 common frames omitted
是一个数组方法,删除并返回数组的第一个元素。在函数的情况下,数组是shift
,它在函数数组中。您应该使用queue
而不是input = queue.shift();
执行此操作后,input = queue[i].shift();
将是一个函数,但您需要使用正确的参数运行该函数。我希望这些信息不会为您的问题发布解决方案,而是让您从正确的方向着手。
超级华丽的解决方案:
input
答案 3 :(得分:1)
使用for循环,...此外,在调用函数后队列应为空。
for
基于循环的变体......
var puzzlers = [
function(a) { return 8 * a - 10; },
function(a) { return (a - 3) * (a - 3) * (a - 3); },
function(a) { return a * a + 4; },
function(a) { return a % 5; }
];
var startValue = 2;
var applyAndEmpty_for = function (value, queue) {
for (var fct, idx= 0, len = queue.length; idx < len; idx++) {
fct = queue[idx];
value = fct(value);
}
queue.length = 0; // empty queue explicitly.
return value;
};
console.log(applyAndEmpty_for(startValue, puzzlers), puzzlers); // 3 []
while
基于循环的变体......
var puzzlers = [
function(a) { return 8 * a - 10; },
function(a) { return (a - 3) * (a - 3) * (a - 3); },
function(a) { return a * a + 4; },
function(a) { return a % 5; }
];
var startValue = 2;
var applyAndEmpty_while = function (value, queue) {
var fct;
while (fct = queue.shift()) { // empty queue by shifting.
value = fct(value);
}
return value;
};
console.log(applyAndEmpty_while(startValue, puzzlers), puzzlers); // 3 []
答案 4 :(得分:0)
这是CodeSchool JavaScript RoadTrip Part-3(Level 1,Challenge 13)对吗?
到目前为止,我找到了本课程中最严峻的挑战。但是,在花了几个小时的时间后,我想出了最简单的解决方案。
var puzzlers = [
function(a) { return 8 * a - 10; },
function(a) { return (a - 3) * (a - 3) * (a - 3); },
function(a) { return a * a + 4; },
function(a) { return a % 5; }
];
var start = 2;
var applyAndEmpty = function(input, queue) {
var length = queue.length;
for(var i = 0; i < length; i++) {
input = queue.shift()(input);
}
return input;
};
alert(applyAndEmpty(start, puzzlers));