修改一个清理JSON对象javascript的函数

Modify a cleaning JSON object javascript function

所以,这是我的函数,它从 Javascript 中的 JSON 对象中删除空属性和 null 属性。我需要删除空嵌套对象的功能,但它现在没有这样做。我已经尝试修改此功能但多次失败(我从该站点的旧 post 获得此功能)。

有人可以帮我解决这个问题吗?

函数

function clean_object(test, recurse) {
    for (var i in test) {
        if (test[i] === null || test[i] == ""  ) {
            delete test[i];
        } else if (recurse &&  typeof test[i] === 'object' ) {
            clean_object(test[i], recurse);
        }
    }
}

清理前的对象

{ "data.openstack.public_ipv4": "falseip" }

清理后的对象

{"data":{"openstack":{}}}

我需要什么

{}

提前致谢!

通过作为部分方法提供的第一个开发步骤,我只是想让示例以清除所有对象 null 值和零长度字符串值的方式工作...

function clearEmptyValuesRecursively(obj) {
  if (Array.isArray(obj)) {
    obj.forEach(function (item) {

      clearEmptyValuesRecursively(item);
    });
  } else {
    Object.keys(obj).forEach(function (key) {
      var value = obj[key];

      if ((value === null) || (value === '')) {

        delete obj[key];

      } else if (typeof value !== 'string') {

        clearEmptyValuesRecursively(value);
      }
    });
  }
  return obj;
}


var data = {
  "data": {
    "openstack": {},
    "fullstack": "fullstack",
    "emptyString": ""
  },
  "emptyData": null
};

console.log('data - before : ', JSON.stringify(data));
clearEmptyValuesRecursively(data);
console.log('data - after : ', JSON.stringify(data));

data = {
  "data": {
    "openstack": {}
  }
};

console.log('data - before : ', JSON.stringify(data));
clearEmptyValuesRecursively(data);
console.log('data - after : ', JSON.stringify(data));
.as-console-wrapper { max-height: 100%!important; top: 0; }

...在第二步中我回收了上述方法。这次构建递归工作函数主要是为了清除空主(数据)结构,如 {}[],但它也负责删除空值,如第一种方法所示。总而言之,这也是 OP 确实要求的......

function clearEmptyStructuresRecursively(obj) {
  function isEmptyStructure(type) {
    return ((Object.keys(type).length === 0) || (Array.isArray(type) && (type.length === 0)));
  }
  function isEmptyValue(type) {
    return ((type == null) || (type === '')); // undefined or null or zero length string value.
  }
  if (Array.isArray(obj)) {
    obj.forEach(function (item) {

      clearEmptyStructuresRecursively(item);
    });
  } else if (obj && (typeof obj !== 'string')) {

    Object.keys(obj).forEach(function (key) {
      var value = obj[key];

      if (isEmptyValue(value) || isEmptyStructure(value)) {
        delete obj[key]; // ... delete ... and step into recursion ...

        clearEmptyStructuresRecursively(obj);
      }
      clearEmptyStructuresRecursively(value);
    });

    Object.keys(obj).forEach(function (key) {
      var value = obj[key];

      if (isEmptyValue(value) || isEmptyStructure(value)) {
        delete obj[key]; // ... final delete.
      }
    });
  }
  return obj;
}

var data = {
  "data": {
    "openstack": {}
  }
};

console.log('data - before : ', JSON.stringify(data));
clearEmptyStructuresRecursively(data);
console.log('data - after : ', JSON.stringify(data));


data = {
  "data": {
    "openstack": {},
    "fullstack": "fullstack",
    "emptyString": ""
  },
  "emptyData": null
};

console.log('data - before : ', JSON.stringify(data));
clearEmptyStructuresRecursively(data);
console.log('data - after : ', JSON.stringify(data));
.as-console-wrapper { max-height: 100%!important; top: 0; }