通过模板过滤JSON对象

通过模板过滤JSON对象

问题描述:

我需要根据动态模板过滤JSON对象的属性和值(出于安全原因)。这就像通过仅在运行时已知的掩码来查看JSON对象。通过模板过滤JSON对象

说我有此JSON对象:

{ "id": "1", 
    "foo": [ "1", "2", "3" ], 
    "bar": [ "a", "b", "c"], 
    "fuzz": [ "y", "x" ] 
} 

而这个模板:

{ "id": "", 
    "fuzz": [ "y", "z"], 
    "foo": "" 
} 

现在我想有以下结果(应用模板到对象):

{ "id": "1", 
    "fuzz": [ "y" ], 
    "foo": [ "1", "2", "3" ] 
} 

什么是过滤器的最佳解决方案

  1. 只有属性(保留值不变)?
  2. 属性和值(如上例)?

注:

  • 属性和值的顺序可能是模板和对象
  • 我的环境是的NodeJS + BackboneJS
  • 一个具有大量的对象来过滤不同,所以性能事项
+0

什么是'了''B','C '等等?他们只是为了这篇文章的替代品吗?因为他们使JSON无效。 – 2013-03-16 09:01:05

+0

是的,他们是 - 我已纠正帖子,使其更符合 – 2013-03-16 09:05:32

+0

*“什么是最好的解决方案过滤器......只有属性(保持值不变)?”*您的示例结果更改了其中一个值,'fuzz'属性的值 - 你已经从中删除了'“x”'条目)。 – 2013-03-16 09:07:41

基础上WiredPrairie的建议下,我重写_.pick()和_.intersection()到下面的方法做的伎俩:

// Loosely based on Underscore.js _.pick() method 
function project(obj, tmp) { 
    var copy = {}; 
    var keys = _.keys(tmp); 
    _.each(keys, function(key) { 
     if (key in obj) { 
      var vals = tmp[key]; 
      if (Array.isArray(vals)) { 
       var copy_vals = []; 
       // Next lines could be replaced by: 
       // cvals = _.intersection(vals, obj[key]); 
       _.each(vals, function(val) { 
        if ($.inArray(val, obj[key])!=-1) { 
         copy_vals.push(val); 
        }; 
       }); 
       copy[key] = copy_vals; 
      } else { 
       copy[key] = obj[key]; 
      }; 
     }; 
    }); 
    return copy; 
} 

我不知道,但你可以尝试读取这个jQuery.extend

+0

这不是他们正在寻找的合并。这将如何帮助? – WiredPrairie 2013-03-16 11:38:47