我有一个allowedFields数组,它基于从表单生成的JSON数组中的键名。
此阶段不需要许多检索到的字段,因此不应通过验证过程,因此我希望将JSON数组的值与allowedFields数组的值匹配
从表单
返回JSON{"reference":"sdfsdfsdfsd",
"start_date":"04/22/2014",
"end_date":"05//2014",
"status":"1","frequency":"M",
"day":"sat",
"contract_type":"S",
"notice_period":"1M"}
allowedFields = array(
reference,
start_date,
end_date,
contract_type
)
基本上我需要删除allowFields javascript数组中未列出的任何字段
答案 0 :(得分:1)
var all = {"reference":"sdfsdfsdfsd",
"status":"1"};
var allowedFields = ['reference']; // note quote marks to create strings
function filter(data, allowed) {
var filtered = {};
for(var id=0; id < allowed.length; ++id) {
var allowedField = allowed[id];
if(data.hasOwnProperty(allowedField)) {
filtered[allowedField] = data[allowedField];
}
}
return filtered;
}
console.log(filter(all, allowedFields));
>> [object Object] {
>> reference: "sdfsdfsdfsd"
>> }
答案 1 :(得分:1)
1)将JSON解析为对象。
var obj = JSON.parse(json);
2)确保您已正确定义阵列。
var allowedFields = ['reference','start_date','end_date','contract_type'];
3)循环对象,如果键不在数组中,则将其删除。
for (var k in obj) {
if (allowedFields.indexOf(k) < 0) delete obj[k];
}
4)将对象字符串化回JSON。
var str = JSON.stringify(obj);
<强>输出强>
{"reference":"sdfsdfsdfsd","start_date":"04/22/2014","end_date":"05//2014","contract_type":"S"}
答案 2 :(得分:0)
underscore.js解决方案:
_.pick(obj,allowedFields)
还有_.omit(obj,string|string[])
反其道而行之。
underscore.js非常有用,我使用它很多,但您也可以选择您需要的工具并将其包含在您的代码中。该库已经过优化,无需编写自己的库。
以下是实施(来自here)
_.pick = function(obj, iterator, context) {
var result = {};
if (_.isFunction(iterator)) {
for (var key in obj) {
var value = obj[key];
if (iterator.call(context, value, key, obj)) result[key] = value;
}
} else {
var keys = concat.apply([], slice.call(arguments, 1));
for (var i = 0, length = keys.length; i < length; i++) {
var key = keys[i];
if (key in obj) result[key] = obj[key];
}
}
return result;
};