根据允许的项目数组删除JSON项目

时间:2014-04-01 10:47:24

标签: javascript arrays json

我有一个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数组中未列出的任何字段

3 个答案:

答案 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"
>> }

Demo

答案 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"}

Fiddle

答案 2 :(得分:0)

underscore.js解决方案:

_.pick(obj,allowedFields)

http://underscorejs.org/#pick

demo

还有_.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;
  };