Javascript 如何从json中删除空白字段?
所以我得到了一个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; }
- 空数组或对象
- 带空格(“”或“”)的字符串
值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对我不起作用。