Javascript 修改JSON数据

Javascript 修改JSON数据,javascript,json,Javascript,Json,我有一个下面的示例数据,我根据一定的逻辑修改它并返回修改过的对象 var obj = [{ Primary: "Hejrwe", TestVal: "234723", TestTool: [{ label: 'xyz', num: '23' }, { label: "", num: "" }, { label: "", num: "" }], TestItv: [{ label: 'xyz', num:

我有一个下面的示例数据,我根据一定的逻辑修改它并返回修改过的对象

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”键

是否有更好的解决方案,可以在遍历对象时删除这些值

只需使用
.filter()
即可根据您的条件将集合减少到新数组中

.map()
应该替换为
.forEach()
,并且那里不需要
对象.keys()
,因为
obj
实际上是一个
数组

obj.forEach(function(val) {
  val.TestTool = val.TestTool.filter(function(o) {
    return o.label !== "" || o.num !== "";
  });
});
因此,每当
.filter()
回调返回
true
,该项都将添加到最终返回的新数组中


下面是一个完整的演示:

var obj=[{
小学:“Hejrwe”,
TestVal:“234723”,
测试工具:[{
标签:“xyz”,
数字:“23”
}, {
标签:“,
num:“
}, {
标签:“,
num:“
}],
TestItv:[{
标签:“xyz”,
数字:“23”
}, {
标签:“,
num:“
}, {
标签:“,
num:“
}]
}, {
初级:“Urwhe”,
TestVal:“32432”,
测试工具:[{
标签:“abc”,
数字:“24”
}, {
标签:“,
num:“
}, {
标签:“,
num:“
}],
TestItv:[{
标签:“abc”,
数字:“24”
}, {
标签:“,
num:“
}, {
标签:“,
num:“
}]
}];
对象forEach(功能(val){
val.TestTool=val.TestTool.filter(函数(o){
返回o.label!==“o.num!==”;
});
});
document.querySelector(“pre”).textContent=JSON.stringify(obj,null,2)

你可以试试这样的东西。我只是在每个对象属性上使用delete操作符

 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空值

我还假设如果标签和值都为空,您只想过滤掉


我还假设每个对象都有一个TestTooltesttv,否则您需要为未定义的

@RajPowar:
。forEach()
只是一个通用迭代器,有点像
for
循环。您可以操纵在每次迭代中传递的每个对象。您基本上使用的是
.map()
就像
.forEach()
一样。不同之处在于
.map()
返回一个从回调返回的新值数组,因此它实际上返回了一个
未定义的
值数组,因为回调没有
返回
。yes相同的逻辑适用于Testiv和yes“label”和“value”两者都必须是empty@RajPowar-那么这就是你一直在寻找的答案。我将更新以取消注释您确认需要的部分。@RajPowar-通过将过滤结果直接绑定回对象属性,使其更加简洁。如果对结果满意,请标记为正确答案。@RajPowar-通过重构filter()函数进一步压缩答案。见最终解决方案。
 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));