Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.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中删除空白字段?_Javascript_Json - Fatal编程技术网

Javascript 如何从json中删除空白字段?

Javascript 如何从json中删除空白字段?,javascript,json,Javascript,Json,所以我得到了一个json,我必须通过删除所有“空白”字段来清理它。被视为空白的字段包括: 空数组或对象 带空格(“”或“”)的字符串 null值 这就是我到目前为止所做的: const isBlank = (val) => { if(val === null ) { return true } if(typeof val === 'string'){ return val.trim().length === 0; }

所以我得到了一个json,我必须通过删除所有“空白”字段来清理它。被视为空白的字段包括:

  • 空数组或对象
  • 带空格(“”或“”)的字符串
  • null
这就是我到目前为止所做的:

const isBlank = (val) => {
    if(val === null ) {
        return true
    }
    if(typeof val === 'string'){
        return val.trim().length === 0;
    }
    return val.length === 0
};


function clean(jsonInput) {
    Object.keys(jsonInput).forEach( key => {
        if(typeof jsonInput[key] === 'object' && !isEmpty(jsonInput[key])){
            clean(jsonInput[key])
        }else {
            isEmpty(jsonInput[key_field]) && delete jsonInput[key]
        }
    })

}
这是我正在使用的
jsonInput

{
    "print": "notBlank",
    "this": "notBlank",
    "example": "notBlank",
    "blank": null,
    "allBlanks": [
        {
            "from": "",
            "blank0": null
        }
    ],
    "att2": {
        "blank1": "",
        "blank2": []
    },
    "att3": {
        "one": "1",
        "two": "2",
        "three": "3",
        "blank3": " "
    }
}
这应该是输出:

{
    "print": "notBlank",
    "this": "notBlank",
    "example": "notBlank",
    "att3": {
        "one": "1",
        "two": "2",
        "three": "3"
    }
}
相反,我得到的是:

{
    "print": "notBlank",
    "this": "notBlank",
    "example": "notBlank",
    "allBlanks": [{ }],
    "att2": {},
    "att3": {
        "one": "1",
        "two": "2",
        "three": "3",
    }
}
好像我无法移除这些物体。。。你知道我做错了什么吗?不管怎样我都能修好


还有一种方法可以做到这一点,这样我就不会更改原始对象,而是复制一个对象,可以使用
map
filter

类似的一些功能已经存在于lodash

避免在javascript中使用delete,这样做速度慢而且不是一个好的做法

例如:

var _ = require("lodash")

var oldObj = {a:1, b:2, c:null, d:"aa"}

var newObj = _.omitBy(oldObj, (value, key) => 
                              _.isNull(value) || 
                              (_.isString(value) && _.isEmpty(value)) ||
                              (_.isArray(value) && _.isEmpty(value))  );
console.log("Final", newObj) //Final { a: 1, b: 2, d: 'aa' }
isEmpty如果值是数字,则返回true

编辑:

关键字delete在严格模式下引发异常


这里的主要问题是,
[{}]
没有定义为“空”,因为它是一个长度为1的数组,其中包含一个对象。但是,由于您希望将空对象视为空,从而使包含空对象的数组为空,因此还需要在
isEmpty
函数中递归以覆盖这些角度

注意对添加到
isEmpty
中的数组和对象的两个递归调用

至于复制,最快的方法是先字符串化,然后解析json。您可以在代码的底部看到这一点

var jsonCopy = JSON.parse(JSON.stringify(json));
还有更复杂的深度复制方法,请阅读以了解更多信息

const isEmpty=(val)=>{
如果(val==null){
返回真值
}
if(typeof val=='string'){
return val.trim().length==0;
}
if(数组的val instanceof){
如果(val.length==0)返回true;
返回val.every(v=>
isEmpty(五)
);
}
如果(val==对象(val)){
if(Object.keys(val).length==0)返回true;
返回Object.values(val).every(
v=>isEmpty(v)
);
}
返回val.length==0;
};
功能清理(jsonInput){
key(jsonInput).forEach(key=>{
if(jsonInput[key]=='object'&&!isEmpty(jsonInput[key])的类型){
清洁(jsonInput[键])
}否则{
isEmpty(jsonInput[key])&删除jsonInput[key]
}
})
}
var json={
“打印”:“非空白”,
“此项”:“非空白”,
“示例”:“非空白”,
“空白”:空,
“全部空白”:[
{
“从”:“从”,
“blank0”:空
}
],
“附件二”:{
“空白1”:“,
“空白2”:[]
},
“附件三”:{
“一”:“一”,
“二”:“二”,
"三":"三",,
“空白3”:”
}
};
var jsonCopy=JSON.parse(JSON.stringify(JSON));
清洁(jsonCopy);

console.log(jsonCopy)
这个问题与JSON无关。解析JSON,然后处理生成的对象。是的,
filter
通常是您想要的,看起来您想要递归地执行此操作,但并不完全清楚。我改为按函数省略,cloneDeepWith对我不起作用。