2014-02-12 184 views
-1

比方说,我想实现这个功能:如何实现泛型映射函数?

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. simp的映射乐属性:你好 - > HELLO
  2. 映射嵌套属性,具有点作为分隔符:embedded.prop1 - > embedded.propOne
  3. 旧属性被删除(你好和embedded.prop1)
  4. 这必须是一个通用功能,接受任何复杂的映射
  5. 不需要支持重命名容器:embedded.prop1 - > EMBEDDED.prop1是而不是需要。
  6. 的属性的值留明显相同
  7. 如果没有找到在映射指定的属性,它它设置为空
  8. 积分为其中,给定相同的映射reverseMapper,确实反向操作
+0

我无法想象这样一个功能的使用。它试图一次完成太多事情,并且可能会比正确的结果更频繁地给你带来意想不到的结果。无论如何,这对于堆栈溢出来说是相当不重要的。您刚刚发布了一份*长*的需求清单,并要求我们为您完成工作。 – meagar

+1

那么......你问人们为你实施这个吗?你问这是不是个好主意?你是否要求人们审查,看看这些要求是否有问题? – ajp15243

+0

这将是一个不错的入门级卡塔http://www.codewars.com – aemxdp

回答

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

谢谢,看起来很有趣,我现在检查一下。 – dangonfast

+0

工作正常。内循环中的小bug(p已经定义)。我忘了提及:映射*中未指定的属性应保持原样*。现在我试着补充一下.. – dangonfast

+0

是的,你应该已经指定了......一个'for(n in data)if(!(n in res || n in mapping))res [n] = data [n ];''return'之前应该做到这一点(尽管不是反向工作)。 – Bergi

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

不是任务,只是我的应用程序中的问题,很少有时间解决。谢谢,但@Bergi的解决方案看起来更简单(并且不会分裂和反转!) – dangonfast