从数组中获取一个函数javascript

Get a function from an array, javascript

本文关键字:一个 函数 javascript 数组 获取      更新时间:2023-09-26

得到一个带有函数的数组。我想做一个函数,用给定的函数名作为参数从数组中返回一个函数。

var arr = [
  function Dog(){},
  function Cat(){}
];

var getFunction = function(name){
    return // should return the function with matching name
};
var dogFunction = getFunction('Dog'); // returns dog function.

https://jsfiddle.net/zcjd9pyz/

这可能吗?

如果你做一个关联数组,它可能是

var arr = {
    'dog' : function Dog(){},
    'cat' : function Cat(){}
};
arr['dog']();

函数具有name属性:

var getFunction = function(name){
    for (var i=0; i<arr.length; i++) {
       if (arr[i].name===name) return arr[i];
    }
    return // return undefined
};

如果你想快速访问,你可以通过首先迭代来预计算地图:

var map = arr.reduce(function(m,f){ m[f.name]=f; return m}, {});

它允许

var fun = map["Dog"];

用代码计算地图,而不是自己键入,这样就不会重复名称。DRY代码更易于维护。

编辑:我不确定函数在IE上有名字,但我不能测试它。

在ES6中,您可以在不修改数组的情况下完成此操作(或者在除Internet Explorer之外的所有浏览器中,如果您将箭头函数替换为普通函数并使用polyfill查找:

var getFunction = function(name){
    return arr.find( func => name === func.name );
};

即使在ES6中,我也看不出有什么好的理由这么做。我认为您应该按照Deblaton Jean-Philippe的回答,将数组更改为对象,将名称映射到函数。

您可以使用我的这个示例解决方案,而不是匹配字符串,您可以根据函数名使用它

https://gist.github.com/freewayz/56bd9db6d4164a42be75

var myArray = [{"name" : "pitaside", "id" : 1}, {"name":"github", "id" : 3}]
filterArrayByType: function (arrayToMatch, fieldType, matcher) {
        if(! arrayToMatch instanceof Array){throw ("Not an Array")}
        var filterTypeToReturn = arrayToMatch.filter((items) => {
                var temp;
                if (items[String(fieldType)] === matcher) {
                    temp = items[String(fieldType)]
                }
                return temp;
            }
        );
        return filterTypeToReturn;
}
var myMatcher = 'github'
var id3 = filterArrayByType(myArray, 'name', myMatcher)[0].id
//returns 3

您可以使用Function.prototype.toString()。与name不同,它受到大多数现代浏览器以及Node.js.的支持

var arr = [
    function  Dog ( ) {},
    function  Cat ( ) {}
];
var getFunction = function(name){
    'use strict';
    // could use find but it isn't supported by IE
    return arr.filter(function (func) {
        return /^function's+('w+)/.exec(func.toString())[1] === name;
    })[0];
};
console.log(getFunction('Dog'));
console.log(getFunction('Cat'));
console.log(getFunction('Unknown'));