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' } };
为了说明这一点:

  • 简单属性映射:hello->hello
  • 嵌套属性的映射,以点作为分隔符:embedded.prop1->embedded.propOne
  • 旧属性被删除(hello和embedded.prop1)
  • 这必须是一个通用函数,接受任何复杂的映射
  • 不需要支持容器重命名:embedded.prop1->embedded.prop1是不需要的
  • 这些属性的值显然保持不变
  • 如果未找到映射中指定的属性,则将其设置为null
  • 在给定相同映射的情况下,执行反向操作的reverseMapper可获得额外点数

  • 这是一个你可以使用的概要。但在开始之前,如果这是一项任务,试着自己解决它

    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的解决方案看起来更简单(并且可以进行点拆分和反转!)