数组作为队列和调用函数在另一个内部

时间:2015-05-18 17:52:07

标签: javascript iife

花费越来越多时间学习JS,我喜欢它。然而,当我开始处理稍微复杂的功能(IIFE,匿名等)时 - 我开始挣扎,并且会喜欢一些指针。非常感谢所有的帮助和建议,解释为什么我的代码行(第15行)引起了如此多的悲痛!

分配说明如下:

  1. 构建一个函数并将其分配给名为applyAndEmpty的变量。
  2. 该函数应该包含输入数和函数队列 作为参数。
  3. 使用for循环,按顺序调用队列中的函数 输入数字,其中每个函数的结果成为下一个 功能的输入。此外,队列应该是空的 函数被调用。
  4. 最后,使用提供的start调用applyAndEmpty函数 变量和益智游戏者队列作为参数,并提醒结果。
  5. 到目前为止,我知道我已经正确设置了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));
    

5 个答案:

答案 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));