如何在JavaScript中实现一个函数数组?

4
我对JavaScript还不熟悉。我需要编写一对20 x 20矩阵的函数。我的所有函数都需要输入一个数字并返回一个数字(即相同的签名)。例如,Myfunctions[1][2]应该返回我可以在代码中调用的一对函数。
在Java中,我通常会实现一个20 x 20对象数组,其中每个对象都会实现两个函数。但是,在JavaScript中是否可能实现这样的操作呢?如果不行,我该如何进行类似的操作?如果我需要两个矩阵来模拟这一对,那也可以。

你是指 Myfunctions[1][2] 包含了一对函数? - Matt Ball
如果必要的话,我可以接受两个矩阵。 - Jérôme Verstrynge
嗯,也许你需要澄清问题。为什么你需要一对函数? - Matt Ball
这是一个从/到转换系统。 - Jérôme Verstrynge
6个回答

8

由于在JavaScript中函数是对象,因此您可以很容易地定义一个函数数组。

function foo () { ... }
function bar () { ... }
function baz () { ... }

var fns = [foo, bar, baz];

签名完全不重要。


从那里开始,您可以在循环中动态生成函数,而不是显式声明每个函数:

function generator(n)
{
    return function ()
    {
        return n*n;
    };
}

var squareFuncs = [];

for (var i=0; i<10; i++)
{
    squareFuncs.push(generator(i));
}

然后,您可以构建函数的数组数组(就像任何其他对象一样,请记住):
function anotherGenerator(a, b)
{
    return function ()
    {
        return a+b;
    };
}

var sumFuncs = [],
    temp,
    i,
    j;

for (i=0; i<20; i++)
{
    temp = [];
    for (j=0; j<20; j++)
    {
        temp.push(anotherGenerator(i, j));
    }
    sumFuncs.push(temp);
}

现在,sumFuncs 是一个二维数组(实际上是一个由函数组成的数组),用于计算该函数在矩阵中坐标之和。这可能听起来比实际情况要复杂一些,所以这里有一个例子:
var foo = sumFuncs[7][2],
    sum = foo();
console.log(sum); // prints 9

相关:


3

在ECMAscript中,您实际上不能拥有矩阵数组结构,但是您当然可以创建数组的数组:

function o1() {};
function o2() {};
function o3() {};
function o4() {};
function o5() {};
function o6() {};

var Myfunctions = [
    [ o1, o2 ],
    [ o3, o4 ],
    [ o5, o6 ]
];

现在
Myfunctions[0][1]();

在上述例子中,会执行函数o2

1
我并不是针对jAndy有任何冒犯之意,但为什么这个回答被接受了呢?是的,它非常好地解释了如何拥有一个二维函数引用数组(或JS等效的数组),但问题明确说明“ Myfunctions [1] [2]应该返回我一对可以在代码中调用的函数”。我不知道“一对函数”将如何使用,但在问题中多次提到了它... - nnnnnn
这不是问题中唯一的信息。还有“如果我需要两个矩阵来模拟这对,也可以”。 - Jérôme Verstrynge
1
好的,那好吧。 (除了您不需要使用两个矩阵来模拟对。 您可以轻松获得MyFunctions [1] [2] .a()MyFunctions [1] [2] .b()语法,如其他答案中所示。) - nnnnnn

2
你可以创建一个有两个函数的对象,并将其放入你的数组中。

1
考虑使用函数工厂代替:
function makeFunction(one, two) {
  return function () {
    ...
  }
}

makeFunction(1,2);
// Not functionMatrix[1][2]

我猜如果makeFunction有一个影响结果的闭包,那么这可能会很有用。想一想就让我的头晕。 - Hogan

1
Myfunctions[1][2] = { 
    first: function(val) { return val + 1; }
    second: function(val) { return val - 1; }
};

firstVal = Myfunctions[1][2].first(100);
secondVal = Myfunctions[1][2].second(100);

0

这是一个包含函数对的二维数组:

除了一个用来演示的函数,几乎所有的函数都是匿名函数。

你可以像这样使用它:var myresult = myFuncs[2][3].func1(45);

function extern2ArrayFunc (a) {
  return a+;
}

var myFuncs = [
    [ { "func1" : function (a) { return a+1; },
        "func2" : function (b) { return b-1; }
      },
      { "func1" : exter2ArrayFunc },
        "func2" : function (b) { return b-1; }
      },
      { "func1" : function (a) { return a+1; },
        "func2" : function (b) { return b-1; }
      }
    ],
    [ { "func1" : function (a) { return a+1; },
        "func2" : function (b) { return b-1; }
      },
      { "func1" : function (a) { return a+1; },
        "func2" : function (b) { return b-1; }
      },
      { "func1" : function (a) { return a+1; },
        "func2" : function (b) { return b-1; }
      }
    ],
    [ { "func1" : function (a) { return a+1; },
        "func2" : function (b) { return b-1; }
      },
      { "func1" : function (a) { return a+1; },
        "func2" : function (b) { return b-1; }
      },
      { "func1" : function (a) { return a+1; },
        "func2" : function (b) { return b-1; }
      }
    ]
  ];

我的眼睛,它们流血了。我们能否请您提供一个单一的函数和20个引用。 - Raynos
@Raynos - 显然这完全不是OP所要求的。 - Hogan
@Raynos - 一个函数被引用了20次,这使得整个数组结构变得毫无意义,但如果确实存在需要不同函数的真正问题,那么这个答案展示了如何解决它。 - nnnnnn
我的一些函数将在多个单元格中被重复使用,因此我不想重新编写它们。 - Jérôme Verstrynge
@JVerstry - 然后使用我展示的数组外部方法。我把它放在一个地方,但你可以放在任意多个地方。 - Hogan

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