【问题标题】:Modifying JSON data修改 JSON 数据
【发布时间】:2016-01-13 08:45:50
【问题描述】:

我有以下示例数据,我根据某些逻辑对其进行修改并返回修改后的对象

var obj = [{
  Primary: "Hejrwe",
  TestVal: "234723",
  TestTool: [{
    label: 'xyz',
    num: '23'
  }, {
    label: "",
    num: ""
  }, {
    label: "",
    num: ""
  }],
  TestItv: [{
    label: 'xyz',
    num: '23'
  }, {
    label: "",
    num: ""
  }, {
    label: "",
    num: ""
  }]
}, {
  Primary: "Urwhe",
  TestVal: "32432",
  TestTool: [{
    label: 'abc',
    num: '24'
  }, {
    label: "",
    num: ""
  }, {
    label: "",
    num: ""
  }],
  TestItv: [{
    label: 'abc',
    num: '24'
  }, {
    label: "",
    num: ""
  }, {
    label: "",
    num: ""
  }]
}];

我正在尝试删除 TestTool 数组中“label”和“num”键值为空字符串的任何键,目前我正在解决以下问题

var newObj = {};
Object.keys(obj).map(function(index) {
  var val = obj[index].TestTool;
  var temp = [];

  for (var i in val) {
    if (val[i].label !== "" || val[i].num !== "") {
      temp.push(val[i]);
      //delete val[i];
    }
  }

  obj[index].TestTool = temp;
  newObj = obj;
 });

 console.log(newObj); 

在上面的代码中,“newObj”返回修改后的对象,但是如果你查看应用的逻辑,我使用一个临时数组来存储值,然后将其重新分配给“TestTool”键。

有没有更好的解决方案,我可以在通过对象时删除值?

【问题讨论】:

    标签: javascript json


    【解决方案1】:

    只需使用.filter() 根据您的标准将集合缩减为一个新数组。

    并且.map() 应该替换为.forEach(),并且那里不需要Object.keys(),因为obj 实际上是Array

    obj.forEach(function(val) {
      val.TestTool = val.TestTool.filter(function(o) {
        return o.label !== "" || o.num !== "";
      });
    });
    

    因此,每当.filter() 回调返回true 时,该项目将被添加到最终返回的新数组中。


    这是一个完整的演示:

    var obj = [{
      Primary: "Hejrwe",
      TestVal: "234723",
      TestTool: [{
        label: 'xyz',
        num: '23'
      }, {
        label: "",
        num: ""
      }, {
        label: "",
        num: ""
      }],
      TestItv: [{
        label: 'xyz',
        num: '23'
      }, {
        label: "",
        num: ""
      }, {
        label: "",
        num: ""
      }]
    }, {
      Primary: "Urwhe",
      TestVal: "32432",
      TestTool: [{
        label: 'abc',
        num: '24'
      }, {
        label: "",
        num: ""
      }, {
        label: "",
        num: ""
      }],
      TestItv: [{
        label: 'abc',
        num: '24'
      }, {
        label: "",
        num: ""
      }, {
        label: "",
        num: ""
      }]
    }];
    
    
    obj.forEach(function(val) {
      val.TestTool = val.TestTool.filter(function(o) {
        return o.label !== "" || o.num !== "";
      });
    });
    
    document.querySelector("pre").textContent = JSON.stringify(obj, null, 2);
    <pre></pre>

    【讨论】:

    • @RajPowar: .forEach() 只是一个通用迭代器,有点像for 循环。您可以操作在每次迭代中传递的每个对象。你基本上是在使用.map(),比如.forEach()。不同之处在于 .map() 返回一个新的值数组,该数组是您从回调返回的,因此它实际上返回了一个 undefined 值数组,因为您的回调没有 return
    【解决方案2】:

    这行得通:

     var result = obj.map(function (item) {
      var filterLabels = function (label) {
        return label.label !== '' && label.num !== '';
      };
      item.TestTool = item.TestTool.filter(filterLabels);
      item.TestItv  = item.TestItv.filter(filterLabels);
      return item;
    });
    
    // console.log(JSON.stringify(result));
    

    顺便说一句,我假设您也希望过滤掉 TestItv 空值。

    我还假设您想在 label AND value 都为空的情况下过滤掉 ONLY

    我还假设每个对象都有一个 TestToolTestItv 否则您需要为 undefined 添加额外的检查。

    【讨论】:

    • 是的,同样的逻辑适用于 Testiv,是的,“标签”和“值”都必须为空
    • @RajPowar - 那么这就是您要寻找的答案。我将更新以取消注释您已确认需要的部分。
    • @RajPowar - 通过将过滤后的结果直接绑定回对象属性使其更加简洁。如果对结果满意,请标记为正确答案。
    • @RajPowar - 通过重构 filter() 函数进一步压缩了答案。查看最终解决方案。
    【解决方案3】:

    你可以试试这样的。我只是在每个对象属性上使用删除运算符。

    var obj = [{
      Primary: "Hejrwe",
      TestVal: "234723",
      TestTool: [{
        label: 'xyz',
        num: '23'
      }, {
        label: "",
        num: ""
      }, {
        label: "",
        num: ""
      }],
      TestItv: [{
        label: 'xyz',
        num: '23'
      }, {
        label: "",
        num: ""
      }, {
        label: "",
        num: ""
      }]
    }, {
      Primary: "Urwhe",
      TestVal: "32432",
      TestTool: [{
        label: 'abc',
        num: '24'
      }, {
        label: "",
        num: ""
      }, {
        label: "",
        num: ""
      }],
      TestItv: [{
        label: 'abc',
        num: '24'
      }, {
        label: "",
        num: ""
      }, {
        label: "",
        num: ""
      }]
    }];
    
    Object.keys(obj).map(function(index) {
      var val = obj[index].TestTool;
      var temp = [];
    
      for (var i in val) {
        if (val[i].label == "") {
          delete val[i].label;
        }
        if (val[i].num == "") {
          delete val[i].num;
        }
      }
    
    });
    
    console.log(obj);
    

    【讨论】:

      猜你喜欢
      • 2023-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-25
      • 2020-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多