【发布时间】:2015-04-25 06:37:32
【问题描述】:
我正在寻找一种能够根据某种数据格式过滤对象属性的方法。假设我有一个这样的对象:
var data = {
name : {
first : "Sam",
last : "Wise",
invalid : "Not A Valid Property"
},
address : "210 Test St.",
city : "Springfield",
state : "CA",
zip : "65565",
invalid_key1: "Something invalid",
invalid_key2: "Another invalid one"
}
理想情况下,我想创建一个方法来深入检查每个属性,只允许过滤对象中存在的键。我有一个适用于浅对象的版本,但是我还没有想出一个聪明的方法来为子对象/数组做这件事。
var controlObject = {
'name' : {
first : true,
last : true
},
'address' : true,
'city' : true,
'state' : true,
'zip' : true
};
filterObj(data, controlObject);
// Would return:
// {
// name : {
// first : "Sam",
// last : "Wise"
// },
// address : "210 Test St.",
// city : "Springfield",
// state : "CA",
// zip : "65565"
// }
这是我当前的版本,它只检查一层深度。
_.mixin({
filterObj : function(data, control) {
// First set some defaults.
var _data = data || {};
var _control = control || {};
// Create arguments to be passed to _.pick()
var controlKeys = Object.keys(_control);
var args = [_data].concat(controlKeys);
// Finally use _.pick() to filter object properties.
return _.pick.apply(_, args);
}
});
我试图做一些小技巧让它检查更深层次的对象,但它似乎没有正确地做到这一点。
_.mixin({
filterObj : function(data, control) {
// First set some defaults.
var _data = data || {};
var _control = control || {};
// Create arguments to be passed to _.pick()
var controlKeys = Object.keys(_control);
var args = [_data].concat(controlKeys);
// Finally use _.pick() to filter object properties.
var results = _.pick.apply(_, args);
var moreKeys = Object.keys(_control).filter(function(key) {
return ( _data[key] == "object" || _data[key] == "array" ) ? true : false
});
if( moreKeys.length ) {
_.each(moreKeys, function(key) {
results[key] = _.filterObj(_data[key], _control[key]);
});
return results;
} else {
return results;
}
}
});
目前它被设置为一个 Underscore mixin,虽然我并没有接受这个概念(只是让它更容易在我的应用程序中使用)。
【问题讨论】: