2017-05-30 33 views
0

在JavaScript中,現在是很容易使一個函數接受可變數量的參數:製作功能同時接受可變數量的參數,或值陣列

function doSomething(...args) { 
    args.forEach(arg => console.log(arg)); 
} 

現在,它可以被稱爲像doSomething(1, 2, 3)和所有參數將作爲數組args在函數內部提供。輸出將是:

1 
2 
3 

現在我想調用的函數,通過所有值在一個陣列中,像這樣:

const arr = [1, 2, 3]; 
doSomething(arr); 

,並有同樣的結果。要做到這一點,我必須使用lodash's _.flatten裏面的函數:

doSomething(...args) { 
    args = _.flatten(args); 
    ... 
} 

有沒有更好的辦法來修改我的函數來做到這一點?

我不需要任何解決,我已經有一個。我需要很好的解決方案來完成我所需要的工作,但是沒有像Lodash這樣的第三方庫,並且仍然很優雅。我問是因爲好奇,而不是因爲我不知道該怎麼做,在所有:-)

+0

如果您知道它是一個數組,使用'doSomething(... arr)'。 – str

+0

@str,這是一個有用的提示,但不完全是我所需要的。 –

+0

你可以使用默認參數https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments –

回答

1

apply看看:

function doSomething (...args) { 
    args.forEach(arg => console.log(arg)); 
} 

const arr = [1, 2, 3]; 
doSomething.apply(null, arr); 

或檢查的第一個參數是一個數組:

function doSomething() { 
    let args; 
    if (Array.isArray(arguments[0])) { 
    args = arguments[0]; 
    } else { 
    args = Array.slice(argument); 
    } 
    args.forEach(arg => console.log(arg)); 
} 

const arr = [1, 2, 3]; 
doSomething.apply(null, arr); 

這種做法不過是一個比較冗長,不使用擴展運算符。此外,這樣的事情是行不通的:

const arr = [[1, 2], [3, 4]]; 
doSomething.apply(null, arr); 
+0

'doSomething.apply(NULL,ARR)'不'DoSomething的(ARR)',但它是有趣的方法。 –

+0

如果我省略'...',該功能將不支持與通過類似的參數調用'(1,2,3)',與他們的可變數目。 –

+0

是的,你是完全正確的。我在撰寫評論時沒有考慮到這一點。 – PeterMader

1

如果你不想扁平化所有陣列,但只使用一個,那麼下面應該做的:

if (Array.isArray(args[0])) args = args[0]; 

您還可能希望在那種情況下檢查args.length == 1

但總的來說,而不是重載你的函數做不同的事情有不同數量或類型的參數,它更容易和更安全地提供多種功能:

function doSomething(...args) { 
    // implementation 
} 
function doSomethingArr(arr) { 
    return doSomething(...arr); 
} 

function doSomething(...args) { 
    return doSomethingArr(args); 
} 
function doSomethingArr(arr) { 
    // implementation 
} 
相關問題