【问题标题】:JSON + JS: How to recursively set empty objects {} to null?JSON + JS:如何递归地将空对象 {} 设置为 null?
【发布时间】:2015-05-23 23:45:22
【问题描述】:

我的 JSON 请求中有一些空对象:

FXP:

"createdBy": {},

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

"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": []
}

【问题讨论】:

  • 请问您为什么要这样做?处理服务器端可能更容易。
  • 您能提供更多上下文吗?一切嵌套有多深?您可以使用 Object.keys(your_object).forEach(callback) 循环一个对象,然后您可以检查 Object.keys(sub_object) 以查看它有多少键。如果它没有键,您可以将其设置为 null。我认为如果您想深入了解此检查,这可能会变得非常混乱..
  • 所以这真的与 JSON 无关吧?您只是想在序列化为 JSON 之前用 null 替换根对象中的空对象吗?

标签: javascript json recursion


【解决方案1】:

JSON.parse 分别。 JSON.stringify 您可以将函数作为第二个参数传递。
此函数获取名称和值作为参数。
因此,您可以在解析期间调整值。字符串化。

【讨论】:

  • 你的意思是JSON.stringify,对吧?
  • 是的,JSON.parse 用于字符串->对象。 JSON.stringify 用于对象->字符串。
  • 这是对象,不是字符串。我不会将对象修改为字符串,更新然后再转换回对象。
  • OP 的措辞有点混乱,因为他开始称它为 JSON。无论哪种方式,都可以通过回调来完成。
  • 感谢您的 cmets,因为我看到 JSON 请求,我知道它已经是一个字符串...我调整了我的答案...
【解决方案2】:

这是一个可能对您有所帮助的递归函数:

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

【讨论】:

  • 你能把你用的json对象贴出来吗?
  • 它对我有用,再试一次,可能是你尝试了旧版本的功能,georg 编辑了一个错误。再试一次,让我知道它是否有效
  • 还是同样的错误ReferenceError: key is not defined, could be by 'undefined' value in object?
  • 你确定你试过你在你的问题上发布的 json 对象吗?因为我试过了,它成功了,我什至添加了一个未定义的值并且没有错误,请发布你导致这个错误的json对象
【解决方案3】:

如果你不太喜欢使用字符串:

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

小提琴:http://jsfiddle.net/cfvm3r63/3/

【讨论】:

  • 我解决了这个问题: var orderString = JSON.stringify($scope.order); var orderStringRaplaced = orderString.split("{}").join(null);
【解决方案4】:

这是使用object-scan 的解决方案。根据您的情况,使用依赖项可能有意义

// const objectScan = require('object-scan');

const data = {"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":[]};

const nullify = (input) => objectScan(['**'], {
  rtn: 'count',
  filterFn: ({ value, parent, property }) => {
    if (
      value instanceof Object
      && !Array.isArray(value)
      && Object.keys(value).length === 0
    ) {
      parent[property] = null;
      return true;
    }
    return false;
  }
})(input);

console.log(nullify(data)); // returns number of changes
// => 4
console.log(data);
// => { main: { id: null, archived: true, createdBy: null, 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: null, orderType: null, 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: null, milestones: [] }
.as-console-wrapper {max-height: 100% !important; top: 0}
<script src="https://bundle.run/object-scan@13.7.1"></script>

免责声明:我是object-scan的作者

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多