2016-07-08 6 views
3

私はかなり長い間この機能を理解しようとしてきましたが、私には意味がありません。この関数の目的は、他の引数の番号と一致する引数の配列内の任意の数値を削除することです。Javascript:この機能を理解するのを手伝ってください。

機能を機能させるためにアレイをスライスする必要があるのはなぜですか?

args.splice(0,1)は冗長ですか?私はそれを取り除き、何も変わらなかった。

スライスは変更されません

function destroyer(arr) { 
    var args = Array.prototype.slice.call(arguments); 
    args.splice(0, 1); 
    return arr.filter(function(element) { 
    return args.indexOf(element) === -1; 
    }); 
} 
destroyer([1, 2, 3, 1, 2, 3], 2, 3); 
+0

@Rayon、それは[1、1] –

+0

です。出力は余分な引数なしで渡された配列です。その場合は、2と3なし。 –

+0

理由は簡単です: 'args'の最初の引数は常に' objects'が等しいので無視されます( '==='は 'もしそれらが参照されている場合にのみ... – Rayon

答えて

4

この例を取るのはラインでそれを介してラインを行こう:

var args = Array.prototype.slice.call(arguments); 

のJavaScriptのarguments変数は配列に似ていますが、それは配列ではありません。あなた自身でこれを試すことができます:arguments instanceof Arrayはfalseを与えます。したがって、配列プロトタイプのsliceメソッドを適用すると、argumentsが実際の配列に変換されます。

args.splice(0, 1); 

これは、最初の引数を取り除くためのもので、ケースではarrです。

return arr.filter(function(element) { 
    return args.indexOf(element) === -1; 
}); 

これはarr内のすべての数字を通過しますと、それは引数に存在する場合、それらの一つ一つをチェックします。 indexOf()が-1を返すと、要素が配列に見つかりませんでした。

+0

しかし' args .splice' ... –

+0

もちろん、それは動作します。最初の引数は配列なので、常にfalseを返す配列と数値を比較します。したがって、実際には、最初の引数を保持するか削除するかは関係ありません。しかし、最初の引数を削除する方が正しいです。 –

+0

これは非常に役に立ちました。ありがとうございました! – Oli

0

...フィルタ機能は、作業の大部分を行うように思えるが、私はそれが実際に番号をフィルタリングする方法が表示されません。元の配列から要素の浅いコピーを返します。元の配列の要素は、返された配列にコピーされます。

var object = { 
'0': 'zero', 
'1': 'one', 
'2': 'two', 
'3': 'three', 
'4': 'four', 
length: 5 
}; 
var sliced = Array.prototype.slice.call(object, 3); 
['three','four']; //output 
0

コメントを追加しました。機能の理解に役立つかどうか確認してください。

function destroyer(arr) { 
    // arr just holds [1, 2, 3, 1, 2, 3] 
    var args = Array.prototype.slice.call(arguments); 
    // args contains nested array with all input params [[1, 2, 3, 1, 2, 3], 2, 3] 
    args.splice(0, 1); 
    //args is spliced and we have [2,3] in args 
    //Filter arr=[1, 2, 3, 1, 2, 3] elements, condition it must not be in args i.e [2,3] 
    return arr.filter(function(element) { 
    return args.indexOf(element) === -1; 
    }); 
} 

destroyer([1, 2, 3, 1, 2, 3], 2, 3); 

引数について読むには、以下の文書を参照してください、この機能で使用されるオブジェクト:

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/arguments

0
  1. PASSE引数[配列[6]、2、3]
  2. 引数の最初の要素をスプライスまたは削除した後の引数[2,3]
  3. closure関数は、配列の最初の要素に存在する要素を他の2つの要素でフィルタリングします。何が起こっているかを理解するにはちょうど[1、1]
0

を返す、我々はFunction.prototype.call methodを理解する必要があります。それ

は、この場合には魔法のJS arguments objectであるあなたがそれに渡す最初引数、上Array.prototype.sliceメソッドを呼び出し、その後、引数が続くものは何でもして渡します。

は、このようにArray.prototype.spliceは不要であり、あなただけ書くことができます。

function destroyer(arr) { 
    var rest = Array.prototype.slice.call(arguments, 1); 
    return arr.filter(function(element) { 
    return rest.indexOf(element) === -1; 
    }); 
} 

実際には、これはspread operatorとES2015 +で実装されている、あなたが書くことができるように:

function destroyer(arr, ...rest) { 
    return arr.filter(function(element) { 
    return rest.indexOf(element) === -1; 
    }); 
} 
0

arrでは、我々 [1,2,3,1,2,3]と がargsになる[[1,2,3,1,2,3]、2,3] フィルタ関数のループがarr とargs.indexOf(element)は、elementがargsにない場合は-1を返します。 したがって、ループ内の最初に要素の値が1であり、ループ

内部args.indexOf(1)-1を返す0のインデックスで、我々は、アレイを有し、第1のインデックスに、我々は持っているので、1引数に存在しないため2と2番目のインデックスには3があります。したがって、条件=== -1は真であり、コンソールに出力される配列に1を返します。 ARRの次の要素の

、即ち、図2に示すように、ステートメントargs.indexOf(2)2 args配列で、すなわち、1存在するで第1のインデックスを返します。同様にループ全体が実行されます。arr

関連する問題