2013-03-16 126 views
0

我需要根據動態模板過濾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

回答

0

基礎上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; 
} 
-1

我不知道,但你可以嘗試讀取這個jQuery.extend

+0

這不是他們正在尋找的合併。這將如何幫助? – WiredPrairie 2013-03-16 11:38:47