不确定标题是否能很好地描述我的问题但是我们走了。 我有一个函数(f1)执行一些处理并使用另一个函数f2作为参数。实际上,f2在f1中被“注入”,因此f2的“签名”可以是不同的(例如,f2可以具有或不具有某些参数)。我想知道尽可能使用通用代码的最佳方法是什么?
这里我们使用代码,这肯定会更好地解释它。 Traverse是我的f1函数,扫描对象中的所有键。对于每个键,它执行某些操作 - 该活动由“注入”的f2执行。在下面的示例代码中,我的函数f2正在用另一个键名替换一个键名(这里的“lastname”和“theLastname”)。它当前编写的方式不是很通用,因为我必须写出f1中的键名。另外,假设我有一个简单的f2函数,它只使用keyname来记录它而没有参数?
// 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);
我想拥有的是:
// 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;
};
所以我可以:
traverse(userList,replaceKey);
traverse(userList,log);
知道如何编写它以使f1独立于f2“签名”吗?
感谢您的帮助!
答案 0 :(得分:0)
如果我理解你的问题,你希望你的方法f1不依赖于传递给它的任何类型的f2。实现它的一种方法是使用方法工厂。
spring.application.name=client-service
spring.cloud.config.uri=http://localhost:8888
现在,您可以通过以下方式创建密钥替换程序的特定版本:
function createReplacer(keyname, newKeyname){
return function(object) {
if (object.hasOwnProperty(keyname)){
object[newKeyname] = object[keyname];
delete data[keyname];
}
return object;
};
};
现在你可以让你的f2封装里面的非泛型参数。所以f1可以按照你的意愿完成....我认为......只需将replaceKey作为DoF传递