Javascript函数接受数组和字符串作为参数

时间:2013-05-20 03:33:42

标签: javascript

我有这段代码:

    var showRegion = function(key) {
        if (key in regionOptions) {
            var entry       = regionOptions[key];
            var builder     = entry.builder;
            var layoutObj   = entry.layoutObj;
            var viewStarter = entry.viewStarter;

            var view = new builder();
            logger.info('Controller.' + key + ' => CreateAccountLayoutController');
            Controller.layout[layoutObj].show(view);
            view[viewStarter]();
        }
    };

我需要的是参数应该能够接受数组或字符串,并且应该以任何方式工作。

示例函数调用:

showRegion('phoneNumberRegion');
showRegion(['phoneNumberRegion', 'keyboardRegion', 'nextRegion']);

4 个答案:

答案 0 :(得分:8)

var showRegion = function(key) {
    if (typeof key === 'string')
         key = [key];
    if (key in regionOptions) {
       ...

无需为每种情况创建代码,只需将密钥字符串转换为一个元素的数组,并且数组的代码将为两者执行。

答案 1 :(得分:6)

这篇文章很老了,但这是一个非常好的提示:

function showRegions(keys) {
  keys = [].concat(keys)
  return keys
}

// short way
const showRegions = key => [].concat(keys)

showRegions(1) // [1]
showRegions([1, 2, 3]) // [1, 2, 3]

答案 2 :(得分:0)

您可以使用typeof检查参数的类型并进行相应的操作,例如

var showRegion = function(key) {
  if( typeof key === 'object') {
      //its an object
  }
  else {
     //not object
  }
}

答案 3 :(得分:-1)

您可以使用string.toString()始终返回相同字符串的事实,并且Array.toString()返回逗号分隔的字符串以及string.split(',')接受三个可能的输入:一个字符串,一个数组,一个逗号分隔的字符串 - 并可靠地转换为一个数组(前提是你并不期望逗号成为值本身的一部分,你不要介意数字成为字符串)。

最简单的意思是:

x.toString().split(',');

那样

'a' -> ['a']
['a','b'] -> ['a','b']
'a,b,c' -> ['a','b','c']
1 -> ['1']

理想情况下,您可能希望容忍null,undefined,empty-string,empty-array(并且仍然保持方便的单行):

( (x || x === 0 ) && ( x.length || x === parseFloat(x) ) ? x.toString().split(',') : []);

那也是

null|undefined -> []
0 -> ['0']
[] -> []
'' -> []

您可能希望以不同方式解释null / empty / undefined,但为了保持一致性,此方法将这些转换为空数组,以便下游代码不必检查array-having-elements(或者如果迭代,则不检查)必要的。)

如果这对您构成约束,这可能不会非常有效。

在你的用法中:

var showRegion = function(key) {
    key = ( (key || key === 0 ) && ( key.length || key === parseFloat(key) ) ? key.toString().split(',') : []);

    /* do work assuming key is an array of strings, or an empty array */
}