2014-12-25 27 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]; 
}; 
相關問題