2016-12-01 33 views
0

タイトルの井戸が私の質問を説明しているのかどうかはわかりませんが、ここで説明します。 私はいくつかの処理を行い、別の関数f2を引数として使う関数(f1)を持っています。実際、f2はf1に「注入」されているため、f2の「シグネチャ」は異なる場合があります(たとえば、f2にはいくつかのパラメータがあるかもしれません)。私は疑問に思っています可能な限り一般的なコードを持っている最善の方法は何ですか?Javascript:関数をパラメータとして呼び出す関数

ここではコードを説明しますが、それは確かにそれをよりよく説明します。 トラバースは私のf1関数であり、オブジェクト内のすべてのキーをスキャンします。各キーについて、それは何かを行います - その活動は「注入された」f2によって実行されます。以下のサンプルコードでは、私の関数f2がキー名を別のキー名(ここでは "lastname"と "theLastname")で置き換えています。現在書かれている方法は非常に一般的ではないので、キー名がf1に書かれているものを書かなければならない。また、パラメータなしでログオンするだけのキー名が必要な単純なf2関数があるとしますか?私が持つことができるように

// f1 function 
function traverse(o,doF) { 
    for (var i in o) { 
    doF('key : ' + i + ', value: ' + o[i]); 

    if (o[i] !== null && typeof(o[i])==="object") { 
     //going on step down in the object tree!! 
     traverse(o[i],doF); 
    } else { 
     doF(o); 
    } 
    } 
    return o; 
}; 

::私はしたいのですがどのような

// f2 function 
function replaceKey(object,keyname,newKeyname) { 
    if (object.hasOwnProperty(keyname)){ 
     object[newKeyname] = object[keyname]; 
     delete data[keyname]; 
    } 
    return object; 
}; 

// f1 function 
function traverse(o,doF) { 
    for (var i in o) { 
    doF('key : ' + i + ', value: ' + o[i]); 

    if (o[i] !== null && typeof(o[i])==="object") { 
     //going on step down in the object tree!! 
     traverse(o[i],doF); 
    } else { 
     doF(o,"lastname","theLastname"); // this is dependant on f2 signature - would like to make it more generic 
    } 
    } 
    return o; 
}; 


traverse(userList,replaceKey); 

のようなものです

traverse(userList,replaceKey); 
traverse(userList,log); 

のF1独立しを作るためにそれを書くためにどのように任意のアイデアf2 "署名"?

ありがとうございました!

+0

あなたがしようとしていることがわかりません。 'doF'(つまり' replaceKey')とは1つのパラメータだけで動作するはずのものは何ですか? – Blorgbeard

+0

'データを削除する[keyname];' - それは 'delete object [keyname];でなければなりません。 –

答えて

0

私があなたの問題を正しく理解していれば、メソッドf1を渡すf2のタイプに依存しないようにしてください。これを達成する1つの方法は、メソッドファクトリを使用することです。

function createReplacer(keyname, newKeyname){ 
    return function(object) { 
     if (object.hasOwnProperty(keyname)){ 
      object[newKeyname] = object[keyname]; 
      delete data[keyname]; 
     } 
     return object; 
    }; 
}; 

今、あなたがして、キー代替品の特定のバージョンを作成することができます。今、あなたは内部スコープの非汎用パラメータをカプセル化し、あなたのF2を持つことができ

var replaceKey = createReplacer("lastname","theLastname"); 

。ですから、f1はあなたが望むように行うことができます。私は... replaceKeyをDoFとして渡すだけです。

+0

多くのお礼がウラジミールです - それはとても素敵で、私が探していたものです。 – Christian68

関連する問題