2017-02-25 10 views
1

は私がしなければならないものです:フィルタメソッドを使用して配列から要素を削除します。ここ

あなたは1つ以上の引数が続く最初の配列( 駆逐艦関数の最初の引数)で提供されます。最初の配列から の要素をすべて取り除きます。これらの要素は、 引数と同じ値です。

マイコード:

function destroyer(arr) { 
    for(i=1; i < arguments.length; i++) { 
    x = arr.filter(filterer); 
    } 

    function filterer(val) { 
    return val !== arguments[i]; 
    } 
    return x; 
} 

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

しかし、それは正常に動作し、初期配列でないフィルタ1を返していません。私のミスはどこですか?

答えて

3

基本的には、次の2つの問題、間違った内容で

  • arguments[i]、フィルタ関数のコールバックで、

    function destroyer(arr) { 
        function filterer(val) { // <--------------------+ 
         return val !== arguments[i]; //    | 
         //    ^^^^^^^^^^^^ this points to --+ 
        } 
        for(i=1; i < arguments.length; i++) { 
         x = arr.filter(filterer); 
        } 
        return x; 
    } 
    
  • のない割り当てを持っていませんさらなるフィルタリングのための結果。

ソリューション

  • 試験値にわたって閉鎖と機能を取得し、フィルタ法におけるさらなる試験のために関数を返します。

  • arrの変数を使用して、フィルタ結果を割り当てます。最後にこの値を返します。

function destroyer(arr) {   
 
    function filterer(testValue) {    // take arguments[i] value 
 
     return function (val) {     // return function as callback 
 
      return val !== testValue;   // use testValue instead of arguments[i] 
 
     } 
 
    } 
 

 
    var x = arr         // assign arr as start value for filtering 
 
    for (var i = 1; i < arguments.length; i++) { 
 
     x = x.filter(filterer(arguments[i])); // use filterer with a parameter 
 
    } 
 
    return x;         // return result 
 
} 
 

 
console.log(destroyer([1, 2, 3, 1, 2, 3], 2, 3));

+1

VAR(0)は、入力アレイ – pranavjindal999

+1

@PranavJindal 'filter'は純関数であり、それは時と呼ばれる配列を変更しない変更した方が良いようではないであろう。 'slice'を使うことは不要であり、このメソッドのオーバヘッドに別の配列を作成するだけです。 – gyre

+0

@gyreフィルタは '' x = x.filter(filterer(arguments [i]))ではありません。 '' 'は – pranavjindal999

1

arguments有効範囲が変更されました。

function filterer(val) {return val !== arguments[i];}の中にarguments[i]を使用したいのは、親関数の引数であるdestroyerです。

argumentsの範囲を維持する場合は、filtererarrow機能としてください。

function destroyer(arr) { 
    const filterer = (val) => { // ⚠️ This is an arrow function 
    return val !== arguments[i]; // ⬅️ "arguments" refers now to "destroyer()" args 
    } 
    for(i=1; i < arguments.length; i++) { 
    x = arr.filter(filterer); 
    } 


    return x; 
} 

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

引数オブジェクトのコピーを作成します。 Abdennourが述べたように、引数の範囲は、フィルタリングの対象を変更します。

また、入力配列のコピーを作成し、その配列からのフィルタリングのみを続けます。そうしないと、結果は最後の引数に対してフィルタリングされます。 X = arr.slice

function destroyer(arr) { 
var copy = arguments; 
var x = arr; 
    for(i=1; i < copy.length; i++) { 
    x = x.filter(filterer); 
    } 

    function filterer(val) { 
    return val !== copy[i]; 
    } 
    return x; 
} 

destroyer([1, 2, 3, 1, 2, 3], 2, 3); 
関連する問題