检查函数是否采用数组或单值输入

时间:2016-05-20 19:54:53

标签: javascript

我正在尝试编写一个将数组和另一个函数作为输入的函数。关于提供的函数我唯一知道的是它

  1. 采用单个数字参数并返回新数字或

  2. 获取一组数字并返回一个新的数字数组。

  3. 在我的函数中,我想检查它是第一个还是第二个案例,以确定是否用Array.prototype.map()调用提供的函数。

    所以有了这两个功能......

    var unknownFunction = function( unknownInput ) {
      //Does stuff with input
    
      //returns number or array of numbers...
      return someValueOrValues
    }
    

    var mainFunction = function( anArray, preFunction ){
    
      // SOME CODE TO CHECK IF ARG NEEDS TO BE NUMBER OR ARRAY
      // ...
      // ...
    
        **ANSWER WOULD FIT HERE**
    
    
      if( argIsNumber === true ){
        // function takes NUMBER
        anArray = anArray.map( preFunction )
      }else{
        // function takes ARRAY
        anArray = preFunction(anArray)
      }
    
      // DO STUFF WITH ARRAY AFTER USER FUNCTION HAS MADE IT'S MODIFICATIONS
      // ...
      // ...
      // ...
    
      return anArray;
    }
    

    有没有办法在第一个函数内部找出最佳调用方法?

3 个答案:

答案 0 :(得分:2)

由于JavaScript是一种动态类型语言,因此函数的输入参数只有一些用参数调用它时才会有类型。

一种优雅且可能的方法是向整个给定函数添加属性以提示输入参数类型:

var func = function() {};
func.type = "number"; // a function decorator

var mainFunction = function(anArray, inputFunc) {
    if(typeof inputFunc != "function") {
         throw Error("Please supply a function as 'inputFunc'!");
    } 

    switch(inputFunc.type) {
        case "number":
           return anArray.map(preFunction);

        case "array": 
           return preFunction(anArray);

        default:
           throw Error("Type not supported");
    }
};

mainFunction([1,2,3], func);

使用动态类型语言时,您需要考虑使用convention over configuration和/或使用duck typing进行编码。强类型语言提供的类型安全性被良好的文档所取代。

例如:

  

提供一个函数作为第二个参数,并带有type属性   mainFunction谓词的预期类型是什么   功能

答案 1 :(得分:1)

我会使用try-catch方法,但测试实际的功能,如果没有尝试下一个。

让我们说这些是你的函数,作为你的未知函数传入。它们每个只通过向它添加1来修改数字。

function onlyTakesNumber(num) {
    return num + 1;
}

function onlyTakesArray(arr) {
    return arr.map(num => num + 1);
}

现在,这是你的主要功能。 try内部附加映射的原因是测试以确保在数组传递给onlyTakesNumber函数时没有得到字符串。额外的测试图将再次显示代码是否需要跳入catch。

var mainFunction = function (anArray, preFunction) {

    try {
        // the map on the end checks to make sure you did not get a string back
        anArray = preFunction(anArray).map(test => test);
    }
    catch (e) {
        anArray = anArray.map(preFunction);
    }

    // Do whatever else with anArray

    return anArray;
};


console.log(mainFunction([1, 2, 3], onlyTakesArray)); // [2, 3, 4]
console.log(mainFunction([7, 8, 9], onlyTakesNumber)); // [8, 9, 10]

您可以在

上测试此JSFiddle

答案 2 :(得分:-1)

最短的答案是:“你不能”。