Javascript JSON+;JS:如何递归地将空对象{}设置为null?
我的JSON请求中有几个空对象: FXP: 在将请求发送到服务器之前,我希望将这些空对象转换为以下结构:Javascript JSON+;JS:如何递归地将空对象{}设置为null?,javascript,json,recursion,Javascript,Json,Recursion,我的JSON请求中有几个空对象: FXP: 在将请求发送到服务器之前,我希望将这些空对象转换为以下结构: "createdBy": null, 我如何在整个对象中递归地执行它 示例: { "main": { "id": null, "archived": true, "createdBy": {}, "creationTime": null, "location": { "id":
"createdBy": null,
我如何在整个对象中递归地执行它
示例:
{
"main": {
"id": null,
"archived": true,
"createdBy": {},
"creationTime": null,
"location": {
"id": 79,
"address": {
"id": 79,
"city": null,
"latitude": 50.072613888888895,
"longitude": 14.543111111111111,
"street": null,
"streetNumber": null,
"district": null
},
"bsc": "BSC123",
"code": null,
"indoorOutdoor": null,
"siteId": "A0RST",
"stationType": {
"id": 1,
"name": "Indoor solution"
},
"shared": false,
"sapSacIrnCode": "31049.0",
"abloyLocation": "NA",
"name": "A0RST"
},
"actionName": {},
"orderType": {},
"project": {
"id": 1,
"cards": [],
"color": null,
"managerCustomer": null,
"managerSuntel": null,
"heliosSync": false,
"name": "Vodafone Test",
"parentProject": null,
"team": null,
"facility": {
"id": 1,
"code": 110,
"name": "110_MANAGEMENT"
},
"workers": []
},
"note": "",
"orderNumber": "2626262"
},
"milestoneSequence": {},
"milestones": []
}
在
JSON.parse中JSON.stringify
您可以将函数作为第二个参数传递。
此函数获取名称和值作为参数。
因此,您可以在解析resp期间调整这些值。字符串化。这是一个递归函数,可能会帮助您:
function nullify (obj) {
for(key in obj) {
if(JSON.stringify(obj[key])=="{}") {
obj[key] = null;
} else if (typeof obj[key] == "object" && !Date.parse(obj[key])) {
obj[key] = nullify(obj[key]);
}
}
return obj;
}
对于此示例:
var obj = {
"b": 1,
"c": {},
"d": {
"a": 1,
"b": {},
"c": {
"x": 1,
"y": {}
}
}
}
nullify的结果(obj)代码>是
{
"b": 1,
"c": null,
"d": {
"a": 1,
"b": null,
"c": {
"x": 1,
"y": null
}
}
}
如果您不太喜欢使用字符串:
function emptyObjToNull(object){
var isObject, hasKeys, isArray, current;
for(var k in object){
if(!object.hasOwnProperty(k))
return;
current = object[k];
isObject = typeof current == 'object';
hasKeys = isObject && Object.keys(current).length !== 0;
isArray = isObject && Object.prototype.toString.call(current) === "[object Array]";
if(hasKeys){
emptyObjToNull(current);
}else if(isArray){
for(var i = current.length; i--;){
emptyObjToNull(current);
}
}else if(isObject && !hasKeys){
object[k] = null; // Set the key directly, not the reference
}
}
}
Fiddle:这里有一个使用的解决方案。根据您的场景,使用依赖项可能有意义
//const objectScan=require('object-scan');
const data={“main”:{“id”:null,“archive”:true,“createdBy”:{},“creationTime”:null,“location”:{“id”:79,“address”:{“id”:79,“city”:null,“latitude”:50.07261388888895,“经度”:14.5431111111111,“street”:null,“streetNumber”:null,“district”:null},“bsc”:“BSC123”,“code”:null,“indoorOutdoor”:null,“siteId”:“A0RST”,“stationType”:“id”:1,“name”:“室内解决方案”},“共享”:false,“sapSacIrnCode”:“31049.0”,“abloyLocation”:“NA”,“名称”:“A0RST”},“动作名称”:{},“订单类型”:{},“项目”:{“id”:1,“卡片”:[],“颜色”:null,“管理者”:null,“管理者”:null,“heliosSync”:false,“名称”:“沃达丰测试”,“家长项目”:null,“团队”:null,“设施”:{“id”:1,“代码”:110”,“名称”:工人“:[]}”,注释“,”订单号“:”2626262“}”,里程碑“{}”,里程碑“:[]};
常量nullify=(输入)=>objectScan(['**']{
rtn:'计数',
filterFn:({value,parent,property})=>{
如果(
对象的值实例
&&!Array.isArray(值)
&&Object.keys(value).length==0
) {
父[属性]=null;
返回true;
}
返回false;
}
})(输入);
console.log(nullify(data));//返回更改数
// => 4
控制台日志(数据);
//=>{main:{id:null,存档:true,createdBy:null,creationTime:null,位置:{id:79,地址:{id:79,城市:null,纬度:50.0726138888895,经度:14.5431111111111,街道:null,街道号码:null,地区:null},bsc:'BSC123',代码:null,印地门户:null,站点id:'A0RST,站点类型:{id:1,名称:'室内解决方案'},共享:false,sapSacIrnCode:'31049.0',abloyLocation:'NA',名称:'A0RST'},actionName:null,orderType:null,项目:{id:1,cards:[],颜色:null,managerSuntel:null,heliosSync:false,名称:'Vodafone Test',父项目:null,团队:null,设施:{id:1,代码:110,名称:'110_-MANAGEMENT'},工作人员:[]},注意:'',订单号:'2626262'},里程顺序:null,里程碑:[]}
。作为控制台包装{最大高度:100%!重要;顶部:0}
我可以问一下为什么要这样做吗?处理服务器端可能更容易。您能提供更多的上下文吗?所有东西嵌套的深度有多深?您可以使用Object.keys(您的对象)。forEach(回调)在对象上循环,然后您可以检查Object.keys(子对象)看看它有多少个键。如果它没有键,你可以将它设置为null。如果你想深入检查,这可能会变得非常混乱。所以这真的与JSON无关,对吗?你只是想在序列化为JSON正确之前,将根对象中的空对象替换为null?你的意思是,对吗?是的,JSON.parse
代表字符串->对象。JSON.stringify
代表对象->字符串。这是对象,而不是字符串。我不想将对象修改为字符串,更新,然后再转换回对象。OP的措辞有点混乱,因为他开始称它为JSON。无论哪种方式,都可以通过回调.thanx来完成,就像我一样看到JSON请求,我知道它已经是一个字符串了…我调整了我的答案…你能发布你使用的JSON对象吗?它对我有效,请再试一次,可能是你尝试了旧版本的函数,georg编辑了一个错误。再试一次,让我知道它是否有效仍然是相同的错误引用错误:未定义键,可能是由“Unfi”引起的ned'对象中的值?你确定你试过你在问题上发布的json对象吗?因为我试过了,而且成功了,我甚至添加了一个未定义的值,而且没有错误,请发布导致此错误的json对象。我使用:var orderString=json.stringify($scope.order)解决了它;var orderStringRaplaced=orderString.split(“{}”).join(null);
function emptyObjToNull(object){
var isObject, hasKeys, isArray, current;
for(var k in object){
if(!object.hasOwnProperty(k))
return;
current = object[k];
isObject = typeof current == 'object';
hasKeys = isObject && Object.keys(current).length !== 0;
isArray = isObject && Object.prototype.toString.call(current) === "[object Array]";
if(hasKeys){
emptyObjToNull(current);
}else if(isArray){
for(var i = current.length; i--;){
emptyObjToNull(current);
}
}else if(isObject && !hasKeys){
object[k] = null; // Set the key directly, not the reference
}
}
}