创建一个函数数组,每个函数返回其索引而无需使用循环。

3

我想创建一个返回函数数组的函数。当调用这个数组中的任何函数时,结果必须是该函数在数组中的索引。任务和挑战是在没有使用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 - Bergi
你需要再次查看map方法的文档。无需使用indexOf来查找回调函数被调用的索引! - Bergi
4个回答

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


1
首先,您使用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内部使用for循环来创建具有不同元素(例如0、1、2、3、4...7)的functionsArray,因为new Array(number).fill()创建undefined的数组,即使您执行Array(number).fill(number),在您的情况下,您仍然只创建了一个由7个数字组成的数组,因此这与您的情况下的7个undefined的数组完全相同。所以您的方法行不通。由于您没有提及for循环,这就是我提供使用索引描述的方法的原因。
另外,我建议您添加一些逻辑或创建单独的函数,以确保没有人可以超出边界调用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的意义。后来我继续尝试你的代码,并且只用一个索引就达到了相同的结果。但是你采取的方向正是我所需要的!谢谢你,干得好! - Yevhen Zhemchuzhnykov
抱歉,我只更新了解释部分,之前的解释包括索引和新索引部分,但是忘记更新代码了。我刚刚更新了它。谢谢。 - David Liang

-1
首先,我建议你将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 - Bergi
当然。eval 是邪恶的。它是邪恶的,因为如果你使用 eval,人们可以黑掉你的网站。而函数类只能访问全局变量,而 eval 可以访问您网站中的所有变量和内容。 - Hermanboxcar
访问全局变量将使黑客访问您网站中的所有内容,使用带有任意代码的“Function”同样邪恶。但这不是我的意思,这里没有安全问题,只是在您需要闭包时评估源字符串是一种不良实践 - Bergi

-2

将默认值“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]());


你能解释一下,为什么你要给这个答案投反对票吗? - Rahul Kumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接