2017-08-07 25 views
0

配列またはオブジェクトを最初の引数として受け入れるiterateThroughElements関数があります。 2番目の引数としてオプションの関数があります。関数内の関数パラメータの受け渡し

ユーザーが関数の2番目のパラメータを渡さなかった場合、要素をすべて繰り返し、すべての要素をコンソールログに記録します。

ユーザーが関数を渡すと、関数が実行する関数が正確に実行されます。

は、ここに私のコードです:

function filterArgReturnEvenElements(el) { 
    return (typeof el === 'number') && !(el % 2); 
} 

function returnKeyWithArrayValue(arg, key){ 
    return arg[key] instanceof Array; 
} 


function iterateThroughElements(arg, myFunc){ 
    // if arg is an Array 
    if (arg instanceof Array) { 
    // if function exist then call specific function or callback 
    if(myFunc && typeof(myFunc) == "function"){ 
     return arg.filter(myFunc); 
    // else if function doesnt exist, iterate through array and console.log all the items 
    }else{ 
     arg.forEach(item => console.log(item)); 
    } 
    } 
    // if arg is an Object 
    else if(arg instanceof Object) { 
    // if function exist then call specific function or callback 
    if(myFunc&& typeof(myFunc) == "function"){ 
    return Object.keys(arg).filter(key => myFunc(arg, key)); 
     // else if function doesnt exist, iterate through object and console.log all the items 
    }else{ 
     for(key in arg){ 
     if(arg.hasOwnProperty(key)){ 
     console.log(key + " : " + arg[key]); 
     } 
    } 
    } 
} 

let arr = [1, 2, 3, 4, 5, 7]; 
let obj = { 
    firstname: 'mik', 
    lastname: 'lasner', 
    age: 21, 
    favorite: ['hiking', 'surfing', 'beach'] 
}; 

let output = iterateThroughElements(arr, filterArgReturnEvenElements); 
console.log(output); 

let output2 = iterateThroughElements(obj, returnKeyWithArrayValue); 
console.log(output2); 

let output3 = iterateThroughElements(arr); 
console.log(output); 

let output4 = iterateThroughElements(obj); 
console.log(output2); 

あなたが偶数あるアレイ上のアイテムを返しますfilterArgReturnEvenElements機能の上に見ることができるように。

returnKeyWithArrayValue関数は、配列値を持つオブジェクトのキーを返しますが、

現在、私のコードは機能しません。どこが間違っていたと思いますか?助けてください!

これはもっと便利ですか?

+0

「今のところ私のコードは機能しません」 - これは、説明がなくても無駄な文です。 *具体的に*動作しないのは何ですか?希望する結果と得られた結果を記入してください。私が見る唯一のエラーは 'let output4 = ...; console.log(output2) '(つまり、あなたは実際には' output4'を表示しません。これはとにかく 'undefined'です)。 – Amadan

+0

あなたの4つの出力のどちらが間違っていますか?期待される成果とは何ですか? –

答えて

2

こんにちは1つの括弧が欠落していて、callBack変数も定義されていません。

function filterArgReturnEvenElements(el) { 
    return (typeof el === 'number') && !(el % 2); 
} 

function returnKeyWithArrayValue(arg, key){ 
    return arg[key] instanceof Array; 
} 


function iterateThroughElements(arg, myFunc){ 
    // if arg is an Array 
    if (arg instanceof Array) { 
    console.log("its an array"); 
    // if function exist then call specific callback 
    if(myFunc && typeof(myFunc) == "function"){ 
     return arg.filter(myFunc); 
    // else if function doesnt exist, iterate through array and console.log all the items 
    }else{ 
     arg.forEach(item => console.log(item)); 
    } 
    } 
    // if arg is an Object 
    else if(arg instanceof Object) { 
    // if function exist then call specific callback 
    if(myFunc && typeof(myFunc) == "function"){ 
    return Object.keys(arg).filter(key => myFunc(arg, key)); 
     // else if function doesnt exist, iterate through object and console.log all the items 
    }else{ 
     for(key in arg){ 
     if(arg.hasOwnProperty(key)){ 
     console.log(key + " : " + arg[key]); 
     } 
    } 
    } 
} 
} 
let arr = [1, 2, 3, 4, 5, 7]; 
let obj = { 
    firstname: 'mik', 
    lastname: 'lasner', 
    age: 21, 
    favorite: ['hiking', 'surfing', 'beach'] 
}; 
console.log("it works"); 
let output = iterateThroughElements(arr, filterArgReturnEvenElements); 
console.log(output); 

let output2 = iterateThroughElements(obj, returnKeyWithArrayValue); 
console.log(output2); 

let output3 = iterateThroughElements(arr); 
console.log(output); 

let output4 = iterateThroughElements(obj); 
console.log(output2); 
+0

私はこれが最高の答えだと思います。これを行うより良い方法はありますか?またはifステートメントを使用して良いですか? –

+0

@james私の意見では、配列とオブジェクトを区別するために "if"が必要なので、これはうまく見えます。 –

+0

@JamesHedegonこの問題を解決できますか? –

関連する問題