Javascript 如何实现通用映射函数?
假设我想实现这个功能:Javascript 如何实现通用映射函数?,javascript,Javascript,假设我想实现这个功能: function myMapper(data, mapping) { } 输入为: data = { hello : 'hi' , embedded : { prop1 : 'hiiiii' } }; mapping = { hello : 'HELLO', 'embedded.prop1' : 'embedded.propOne' }; 产出将是: res = myMapper(data, mapping); res is { HELLO : 'hi' , em
function myMapper(data, mapping) { }
输入为:
data = { hello : 'hi' , embedded : { prop1 : 'hiiiii' } };
mapping = { hello : 'HELLO', 'embedded.prop1' : 'embedded.propOne' };
产出将是:
res = myMapper(data, mapping);
res is { HELLO : 'hi' , embedded : { propOne : 'hiiiii' } };
为了说明这一点:
这是一个你可以使用的概要。但在开始之前,如果这是一项任务,试着自己解决它
function myMapper(data, mapping) {
var key, mkey, ret = {};
for (key in data) {
mkey = mapping[key];
//check if there is a direct mapping
if (mkey !== undefined) {
ret[mkey] = data[key];
} else if (/* check for dot in mkey */) {
//use similar construct as above but parse mkey
ret = // assign to the new key
} else if ... etc.
}
return ret;
}
其实很琐碎:
function myMapper(data, mapping, reverse) {
var res = {};
for (var n in mapping) {
var from = (reverse ? mapping[n] : n).split("."),
to = (reverse ? n : mapping[n]).split(".");
for (var o=res, p=data, i=0; i<from.length-1; i++) {
o = o[to[i]] || (o[to[i]] = {});
p = p && p[from[i]];
}
o[to[i]] = p && p[from[i]] || null;
}
return res;
}
函数myMapper(数据、映射、反向){
var res={};
for(映射中的变量n){
var from=(反向映射[n]:n).split(“.”),
to=(逆?n:映射[n])。拆分(“.”);
对于(var o=res,p=data,i=0;iI无法想象这样一个函数的用途。它试图一次完成太多的事情,可能会给您带来意外的结果,而不是正确的结果。无论如何,这对于堆栈溢出来说是非常离题的。您刚刚发布了一个长长的需求列表,并要求我们为您完成工作。那么……您呢你要求人们为你实现这一点?你是在问这是否是一个好主意吗?你是在要求人们审查这些要求是否有任何问题吗?这将是@ajp15243的一个很好的入门级kata:我是在征求关于如何实现这一点的建议。@apsk:不知道如何将问题转移到其他论坛。@meagar:用例是为成员数据中的RestSerializer
实现一个通用的normalizeHash
(这基本上就是这个myMapper所做的,带有一个自定义的每模型映射)。我不同意您的观点,这太复杂了(尽管它可能可以在较小的步骤中拆分):这只是映射属性。谢谢,看起来很有趣,我现在检查一下。工作正常。内部for循环中的小错误(已经定义了p)。我忘了提到:映射中未指定的属性应该保持原样。我现在将尝试添加它。。是的,您应该为(数据中的n)指定A,如果(!(n在res | | n在mapping中)res[n]=data[n];
在返回之前(虽然在相反的情况下不起作用)。这不是作业,只是我的应用程序中的一个问题,几乎没有时间解决。谢谢,@Bergi的解决方案看起来更简单(并且可以进行点拆分和反转!)