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空值
我还假设如果标签和值都为空,您只想过滤掉
我还假设每个对象都有一个TestTool和testtv,否则您需要为未定义的@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));