如何实现通用映射功能?

时间:2014-02-12 19:35:27

标签: 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' , embedded : { propOne : 'hiiiii' } };

说清楚:

  1. 简单属性的映射:hello - > HELLO
  2. 嵌套属性的映射,以点为分隔符:embedded.prop1 - > embedded.propOne
  3. 删除旧属性(hello和embedded.prop1)
  4. 这必须是通用函数,接受任何复杂的映射
  5. 不需要支持重命名容器:embedded.prop1 - > EMBEDDED.prop1需要
  6. 属性的值明显保持不变
  7. 如果未找到映射中指定的属性,则将其设置为null
  8. reverseMapper的加分点,给定相同的映射,执行反向操作

2 个答案:

答案 0 :(得分:3)

实际上很简单:

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;
}

答案 1 :(得分:1)

这是您可以使用的概要。但在潜入之前,如果是作业,请尝试自己解决。

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;
}