Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JSON+;JS:如何递归地将空对象{}设置为null?_Javascript_Json_Recursion - Fatal编程技术网

Javascript JSON+;JS:如何递归地将空对象{}设置为null?

Javascript JSON+;JS:如何递归地将空对象{}设置为null?,javascript,json,recursion,Javascript,Json,Recursion,我的JSON请求中有几个空对象: FXP: 在将请求发送到服务器之前,我希望将这些空对象转换为以下结构: "createdBy": null, 我如何在整个对象中递归地执行它 示例: { "main": { "id": null, "archived": true, "createdBy": {}, "creationTime": null, "location": { "id":

我的JSON请求中有几个空对象:

FXP:

在将请求发送到服务器之前,我希望将这些空对象转换为以下结构:

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