【问题标题】:Creating an array of functions returning their index without loops创建一个函数数组,返回它们的索引而不循环
【发布时间】:2022-01-09 16:08:09
【问题描述】:

我想创建一个返回函数数组的函数。调用数组中的任何函数时,结果必须是该函数在数组中的索引。任务和挑战是创建没有 for 循环的函数。我是这样移动的,但是代码没有按预期工作:

const createArrayOfFunctions = number => {

  const functionsArray = new Array(number).fill();

  return functionsArray.map(element => function() {

    return functionsArray.indexOf(element);

  });

};

我预计:

const testArray = createArrayOfFunctions(7);
testArray[2](); // 2;

有什么方法可以在不使用 for 循环的情况下实现目标。我需要它来完成一个学习项目。

【问题讨论】:

  • 做一个console.log(functionsArray)。您会注意到它仅包含 undefined 值。执行functionsArray.indexOf(element) 将始终在索引0 处找到undefined
  • 您需要再次检查docs for the map method。无需使用indexOf 来找出调用回调的索引!

标签: javascript arrays function methods return


【解决方案1】:

您可以像这样使用Array.from 来实现您的目标:

const createArrayOfFunctions = length => Array.from({length}, (v, i)=> ()=> i);

const arrayOfFunctions = createArrayOfFunctions(10);
console.log(arrayOfFunctions[0]())
console.log(arrayOfFunctions[9]()) // last item would be 9

【讨论】:

    【解决方案2】:

    首先,您使用new Array(number).fill(),它创建了一个undefined 数组。因此,当您调用testArray(2)() 时,您的返回函数中的element 也是undefined。然后你试图找到undefined 的索引,它返回0。它返回0 的原因是因为你的functionsArray 在你的情况下是一个由7 个undefined 组成的数组,那么Array.indexOf 将返回第一个匹配项,并且因为functionArray[0]undefined,所以无论你在functionArray 中调用哪个函数,它总是返回0。有意义吗?

    我对你的代码做了一点改动,试试这个。它应该像你期望的那样工作。我没有使用Array.indexOf或任何其他数组方法,只是因为你只想要索引,为什么不考虑使用索引呢?

    如果您坚持要使用Array.indexOf 来解决您的问题,则必须在createArrayOfFunctions 中使用forloop 来创建具有不同元素的functionsArray(例如0、1、2、3、4 ...7),因为new Array(number).fill() 创建了undefined 的数组,即使您执行Array(number).fill(number),在您的情况下您仍然只是创建一个7 的数组,所以这与7 的数组完全相同undefined 在你的情况下。所以你的方法行不通。既然你没有提到forloop,这就是为什么我提供了上述使用索引的方法。

    另外我建议你添加一些逻辑或创建一个单独的函数以确保没有人可以调用testArray 越界,例如,如果你创建 7 个数组函数,你不希望人们可以拨打testArray[8]。我希望这有帮助。如果您有任何困惑,请告诉我。

    const createArrayOfFunctions = (number) => {
      functionsArray = new Array(number).fill(0);
      return functionsArray.map((element, index) => {
        return () => {          
          return index;
        };
      });
    };
    
    const testArray = createArrayOfFunctions(7);
    console.log(testArray[2]()); // 2;
    console.log(testArray[3]()); // 2;
    console.log(testArray[1]()); // 2;

    【讨论】:

    • 谢谢。我一开始就喜欢你的解决方案,但是,我也不明白 indexNew 的意义。我继续试验你的代码,只用一个索引就得到了同样的结果。但你走的方向正是我需要的!谢谢你,干得好!
    • 我的错,我实际上只更新了解释,之前的解释包括了 index 和 newIndex 部分,但忘记更新代码。我刚刚更新了它。谢谢。
    【解决方案3】:

    首先,我建议你将new Array().fill() 改为[]

    我们可以使用 while 循环重新创建一个 for 循环。

    let x = 0
    while (x < 5) {
    console.log(`five times`)
    x++
    }
    

    因此,我建议你这样做:

    function createarray() {
    let arrayfunc = []
    let i = 0
    while(i<10) {arrayfunc.push(new Function(‘console.log(\‘ + i + \‘)\‘))}
    return arrayfunc
    }
    

    【讨论】:

    • 不要在这里使用eval
    • 当然。评估是邪恶的。这是邪恶的,因为如果您使用 eval,人们可以入侵您的网站。函数类只能访问全局变量,而 eval 可以访问站点中的所有变量和内容。
    • 对全局变量的访问将使黑客能够访问您网站中的所有内容,使用带有任意代码的Function 一样邪恶。但这不是我的意思,这里没有安全问题,它只是一个bad practice to eval source strings,当你只需要一个闭包时。
    【解决方案4】:

    将默认值“0”分配给Array.fill() 方法。

    const createArrayOfFunctions = (len) => {
      const functionsArray = Array(len).fill(0);
      return functionsArray.map((ele, index) => () => index );
    };
    
    const testArray = createArrayOfFunctions(7);
    console.log(testArray[0]());
    console.log(testArray[6]());

    【讨论】:

    • 你能解释一下,你为什么投反对票?
    猜你喜欢
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    相关资源
    最近更新 更多