2016-05-09 13 views
2

Array.prototype.pushを模倣した関数を作成しようとしています。 可変数の引数をとり、それらを特定の配列にプッシュします。 私は、次のコードでこれを行うために管理している:次のjavascriptコードを書き直してください

var array=[]; 
function append(){ 
    for(var i=0;i<arguments.length;i++) 
     array.push(arguments[i]); 
} 

今私の質問です:私は「forループ」使用せずに追記機能を書き換えることはできますか? ありがとうございます。

+0

'return [] .slice。call(arguments); ' – jcubic

+0

' arguments.forEach(function(arg){...}) 'を試すことができます。まだループが、私の意見では少しクリーナー。 –

+1

[Javascriptのプッシュ配列の値を別の配列にプッシュする](0120-17753-1) – Phil

答えて

1

そうArray.prototype.push.apply

function append(){ 
    // make arguments an array 
    var args = Array.prototype.slice.call(arguments); 
    // return the number of elements pushed in the array 
    return Array.prototype.push.apply(array, args); 
} 

使用することができ、ここでargsで何が起こっていますか?我々はArray.prototype.slice.callを引数に使用します。目的はargumentsを特殊なオブジェクトにするために配列にすることです。 Function.prototype.callは、特定のコンテキスト(別名this)を持つ関数を呼び出し、次に引数を(カンマで区切って)関数を呼び出すために使用します。便利なことに、それはslice()thisコンテキストのlengthプロパティを見て、argumentsがあまりにも一つを有する、といないときは、空のように見える、sliceは新しい配列にargumentsをコピーすることを可能にする、0からlength -1の特性を有しています。

+0

こんにちは、それは働いてくれてありがとうございます。 – cssGEEK

+0

@cssGEEKこの部分を説明するために私の答えを更新しました – axelduch

2

あなたは、引数の配列を取得する必要がある場合は、オブジェクトを引数に配列のスライス機能を使用する必要があり、それが標準のJavaScript配列に変換します:

var array = Array.prototype.slice.call(arguments); 
+0

これは機能しません。まず、引数を配列に変換する必要があります。 – jcubic

+0

はい、そうです、私は答えを更新しました。 – alexmac

+1

あなたはconcatを必要としません、 'args'はあなたが必要とする配列です。 – jcubic

0

あなたはforループせずにこれを書き換えることができ、しかし、あなたは何らかの種類のループを使用しなければなりません(あなたは複数の項目を扱っています、それは必要です)。あなたはargumentsが本当の配列ではないという事実を回避する必要があり、ES6なければ

function append(...args) { 
    return array.concat(args); 
} 

:あなたはES6やバベルへのアクセス権を持っている場合は

、私のようなものを使用します。 Arrayプロトタイプを使って配列メソッドにアクセスすることで、ほとんどの配列メソッドを適用することができます。これらのどちらもグローバルarrayを変更しますが、そのことができます組み合わせた値で新しい配列を返すことに注意して

function append() { 
    var args = Array.prototype.map.call(arguments, function (it) { 
    return it; 
    }); 
    return array.concat(args); 
} 

ベア:配列にargumentsを変換すると十分に簡単です、あなたは2をconcatすることができます単独で使用するか、arrayに割り当ててください。これはarray = append(...)に喜んでいる場合は、pushで作業しようとするよりもやや簡単で堅牢です。

0

実際には、戻り値は結果として得られる配列の長さであり、大部分は役に立たないので、プッシュは機能的JSに対して再定義する必要があると正直に信じています。値をプッシュして配列をパラメータとして関数に渡す必要がある場合など、インラインで処理するのは面倒です。代わりに、私はそれが呼び出された配列への参照を返すか、またはどこからでも長さ情報を取得できる新しい配列を返したいと思います。新しいプッシュ提案は次のようになります。

Array.prototype.push = function(...args) { 
         return args.reduce(function(p,c) { 
               p[p.length] = c; 
               return p 
              }, this) 
         }; 

これは、呼び出された配列への完全な参照を返します。

関連する問題