通过模板过滤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" ]
}
什么是过滤器的最佳解决方案
- 只有属性(保留值不变)?
- 属性和值(如上例)?
注:
- 属性和值的顺序可能是模板和对象
- 我的环境是的NodeJS + BackboneJS
- 一个具有大量的对象来过滤不同,所以性能事项
答
基础上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;
}
什么是'了''B','C '等等?他们只是为了这篇文章的替代品吗?因为他们使JSON无效。 – 2013-03-16 09:01:05
是的,他们是 - 我已纠正帖子,使其更符合 – 2013-03-16 09:05:32
*“什么是最好的解决方案过滤器......只有属性(保持值不变)?”*您的示例结果更改了其中一个值,'fuzz'属性的值 - 你已经从中删除了'“x”'条目)。 – 2013-03-16 09:07:41