2014-12-25 23 views
3

我需要编写一个函数来检索传递给函数的最后一个参数。如果它只是参数,它应该返回最后一个元素。如果它是一个字符串,它应该返回最后一个字符。数组应该返回数组的最后一个元素。我的代码适用于数组,字符串和参数,只要它们不是全部字符串。个别字符在javascript参数中被视为字符串

function last(list){ 
    var arr; 
    if(list instanceof Array){ 
    return list[list.length-1]; 
    } 
    if(typeof list === 'string' || list instanceof String){ 
    arr = list.split(""); 
    return arr[arr.length-1]; 
    } 

    return arguments[arguments.length-1]; 
} 

这适用于几乎所有情况,但我有一个问题,当输入是一堆字符串参数。

Test.assertEquals(last('a','b','c','z'), 'z'); 

返回“A”

为什么不相交的字符串进行测试时,如果参数数组或字符串,我怎么能universaly访问任意参数的最后一个值评估为真?

回答

1

像这样的东西应该做的

function last(){ 
    var a = arguments; 
    return (a.length > 1 ? [].slice.call(a) : 
      typeof a[0] === 'string' ? a[0].split('') : a[0]).pop(); 
} 

FIDDLE

0

你的函数调用更改为Test.assertEquals(last(['a','b','c','z']), 'z');

而你通过四个不同的参数last()之前,这传递一个参数,包含四个字符的列表。

+0

这不是一个可接受的解决办法。该函数需要能够接受数组,字符串和参数。提供的测试用例是Test.assertEquals(last(1,“b”,3,“d”,5),5);和我的代码工作,因为它下降到最后一个返回语句,但不相交的字符被读为一个字符串,它进入第二个if语句。 – user137717

0

更改您的最后一个函数是这样的:

function last(list){ 
    var arr; 
    if(list instanceof Array){ 
    return list[list.length-1]; 
    } 
    if((typeof list === 'string' || list instanceof String) && (arguments.length == 1)){ 
    arr = list.split(""); 
    return arr[arr.length-1]; 
    } 

    return arguments[arguments.length-1]; 
}; 
相关问题