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

Delete JSON items based on array of allowed items

本文关键字:数组 删除 JSON 项目数 项目      更新时间:2023-09-26

我有一个允许字段数组,该数组基于从表单生成的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
)

基本上我需要删除任何未在 allowedFields javascript 数组中列出的字段

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

小提琴

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

演示

下划线.js解决方案:

_.pick(obj,allowedFields)

http://underscorejs.org/#pick

演示

也有_.omit(obj,string|string[])反其道

而行之。

underscore.js 非常有用,我经常使用它,但您也可以只选择所需的工具并将其包含在代码中。该库经过了相当优化,无需编写自己的库。

这是实现(从这里开始)

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