2016-09-06 9 views
0

私は関数uniteUniqueを持っています。引数を取得し、それらを単一の配列に連結する必要があります。例3の引数の具体的な量が存在することになる場合uniteUnique関数は2つの引数または他の番号を持っているならば、私は引数の数が不明な配列を連結するにはどうすればいいですか?

function uniteUnique(arr) { 
    var args = []; 
    var newArgs; 
for (var i = 0; i < arguments.length; i++) { 
    args.push(arguments[i]); 
    newArgs = args[0].concat(args[1], args[2]); 
    } 
    return newArgs ; 
} 

uniteUnique([1, 3, 2], [1, [5]], [2, [4]]); 

しかし、何怒鳴る関数のようにそれを実装します。私の機能を作成する方法

uniteUnique([1, 2, 3], [5, 2, 1]) 

それはconcatonate必要がありますどのように多くの引数を知って、そしてどのようにそれがCONCAT()関数内で実装されるでしょうか?

EDIT:

出力は次のようになります。

uniteUnique([1, 3, 2], [1, [5]], [2, [4]])[1,3,1,1,[5],2,を返す必要があります[4] and uniteUnique([1, 2, 3], [5, 2, 1])[1,2,3,5,2,1]

+1

あなたは 'uniteUniqueを呼び出すときに、サンプルの入力とそれぞれの出力を指定することができます'? – gurvinder372

+0

'arr'引数の使い方は?そしてなぜあなたは 'newArgs'ではなく' arguments'を返すのですか? – MarcoS

+0

@MarcoS私はそれを編集しますが、newArgsは最後の引数だけを返します。 – Giedrius

答えて

2

あなたの質問を完全に理解しているかどうかはわかりませんが、この単純な解決方法はどうですか?

function uniteUnique() { 
    return Array.prototype.slice.call(arguments); 
} 

argumentsオブジェクトは本当にArrayインスタンスではなく、配列のいずれかの方法を持っていません。したがって、argumentsオブジェクトにはスライスメソッドがないため、arguments.slice(...)は機能しません。

代わりにArraysにはこの方法があり、argumentsオブジェクトは配列と非常に似ています(...)。その2つは互換性があります。つまり、argumentsオブジェクトを持つ配列メソッドを使用できます。配列メソッドは他の引数オブ​​ジェクトではなく配列を返します。よりthroughtful説明のために

this SO answer ...

UPDATE(OPのコメントに答えるために)を参照してください:あなたは深いマージが必要な場合は、あなたが行うことができます

を:

function uniteUnique() { 
    return Array.prototype.concat.apply([], arrays); 
} 
または偶数:

function uniteUnique() { 
    return [].concat.apply([], arrays); 
} 

Symbol.isConcatSpreadableのdafaule値がfalseあるので、これを使用すると、引数の配列を平らにしたいあなたの例によると...そうconcat()行為深く

+0

これは、トリックは、これの簡単な説明を与えることができましたか? – Giedrius

+0

もちろん、申し訳ありません...いくつかの説明を追加するだけです:-) – MarcoS

+0

残念ながら、コンマで区切られた配列はまだ連結されていません。 – Giedrius

0

を動作するはずです。ES6では、あなたがそれを平らにするために、引数配列とSpread syntaxを取得するためにRest parametersを使用することができます。

function uniteUnique(...args) { 
    return [].concat(...args); 
} 
0

はそのようにこの問題を解決することができた、

function uniteUnique(arr) { 
    var myNewArray = [].concat.apply([], Array.prototype.slice.call(arguments)); 
    return myNewArray; 
} 
uniteUnique([1, 3, 2], [1, [5]], [2, [4]]) ; 
関連する問題