Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.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 如果值为null、未定义或空,如何从对象和/或数组中删除属性?_Javascript - Fatal编程技术网

Javascript 如果值为null、未定义或空,如何从对象和/或数组中删除属性?

Javascript 如果值为null、未定义或空,如何从对象和/或数组中删除属性?,javascript,Javascript,所以我有一个相当复杂的对象,像这样: var obj = { v1:"ok", v2:[ {av1:"foo", av2:null}, // notice there's a null here {av1:"thing", av2:"stuff"} ], v3: null, v4:{ ov1:"slim", ov2:"shady", ov3:null // null

所以我有一个相当复杂的对象,像这样:

var obj = {
    v1:"ok", 
    v2:[
        {av1:"foo",  av2:null}, // notice there's a null here
        {av1:"thing", av2:"stuff"}
    ], 
    v3: null, 
    v4:{
        ov1:"slim",
        ov2:"shady",
        ov3:null  // null
    }, 
    v5:[], // empty
    v6:{} // empty
}
我想把这个拿回来:

var obj = {
    v1:"ok", 
    v2:[{av1:"foo"},{av1:"thing", av2:"stuff"}], 
    v4:{ov1:"slim",ov2:"shady"}
}
我正在尝试编写一个函数,可以删除任何空的、未定义的或空的内容,但它很快就会变成一场意大利式的噩梦,而且不起作用

我觉得有一种更短更优雅的方法可以做到这一点,但到目前为止,这是我的代码:

function deleteNulls(o){
    for(let i in o){
        if(typeof o[i] == "Object"){
            o[i] = deleteNulls(o[i])
        }
        else if(typeof o[i] == "Array"){
            o[i] = deleteNulls(o[i])
        }
        if(o[i] == null || o[i] == "undefined" || o[i] == [] | o[i] == {})
            delete o[i]
        else {
            if(typeof o == "Object"){
                delete this.o[i]
                return o
            }
            else if (typeof o == "Array")
                return o.filter(k => o[k] != null)
        }
    }
    return o
}

var obj = deleteNulls(obj)
我对如何修复上面代码中的错误不感兴趣。如果我愿意,我可以让它工作


我想知道是否有更简单的方法。我建议使用像lodash这样的东西。它的速度和效率经过测试和同行评审

比如:

var result=u.omitBy(my_对象,u.isNil)


这将删除所有空值,您需要更改第二个参数以删除空对象和数组。

我建议使用lodash之类的方法。它的速度和效率经过测试和同行评审

比如:

var result=u.omitBy(my_对象,u.isNil)


这将删除所有空值,您需要更改第二个参数以删除空对象和数组。

以下是我的看法。在大多数情况下都应该足够好

var对象={
v1:“好的”,
v2:[{
av1:“foo”,
av2:null
},//注意这里有一个空值
{
av1:“东西”,
av2:“东西”
}
],
v3:null,
v4:{
ov1:“苗条”,
ov2:“阴凉”,
ov3:null//null
},
v5:[],//为空
v6:{}//empty
}
函数为空(v){
返回v==未定义
||v==null
||(Array.isArray(v)和&v.length==0)
||(typeof v=='object'&&object.keys(v.length==0)
}
函数removeFalsyFromObject(v){
var keys=Object.keys(v);
键。forEach(函数(k){
var-val=v[k];
if(isEmpty(val)){
删除v[k];
}else if(Array.isArray(val)){
从数组(val)中移除FalsyFromArray;
}else if(typeof val=='object'){
从对象(val)中移除falsy;
}
})
}
函数removeFalsyFromArray(a){

对于(var i=0;i这是我的看法。在大多数情况下应该足够好了

var对象={
v1:“好的”,
v2:[{
av1:“foo”,
av2:null
},//注意这里有一个空值
{
av1:“东西”,
av2:“东西”
}
],
v3:null,
v4:{
ov1:“苗条”,
ov2:“阴凉”,
ov3:null//null
},
v5:[],//为空
v6:{}//empty
}
函数为空(v){
返回v==未定义
||v==null
||(Array.isArray(v)和&v.length==0)
||(typeof v=='object'&&object.keys(v.length==0)
}
函数removeFalsyFromObject(v){
var keys=Object.keys(v);
键。forEach(函数(k){
var-val=v[k];
if(isEmpty(val)){
删除v[k];
}else if(Array.isArray(val)){
从数组(val)中移除FalsyFromArray;
}else if(typeof val=='object'){
从对象(val)中移除falsy;
}
})
}
函数removeFalsyFromArray(a){

对于(var i=0;i它帮助我编写了这个解决方案,将逻辑拆分为递归的
clean
函数(简化现有的对象结构)和
shouldKeep
函数(它告诉您是否可以根据键的值从对象结构中完全删除键)

演示片段:
var对象={
v1:“好的”,
v2:[{
av1:“foo”,
av2:null
},//注意这里有一个空值
{
av1:“东西”,
av2:“东西”
}
],
v3:null,
v4:{
ov1:“苗条”,
ov2:“阴凉”,
ov3:null//null
},
v5:[],//为空
v6:{}//empty
}
函数shouldKeep(o){
if(数组isArray(o)){
返回长度
}else if(类型o==='object'){
返回o&&Object.keys(o.length)
}
返回o!=null
}
功能清洁(o){
if(数组isArray(o)){
o、 forEach(清洁)
变量a=o.filter(应保持)
o、 长度
对于(变量i=0;i

.as console wrapper{min height:100vh;}
它帮助我编写了这个解决方案,将逻辑拆分为递归
clean
函数(简化现有对象结构)和
shouldKeep
函数(它告诉您是否可以根据键的值从对象结构中完全删除键)

演示片段:
var对象={
v1:“好的”,
v2:[{
av1:“foo”,
av2:null
},//注意这里有一个空值
{
av1:“东西”,
av2:“东西”
}
],
v3:null,
v4:{
ov1:“苗条”,
ov2:“阴凉”,
ov3:null//null
},
v5:[],//为空
v6:{}//empty
}
函数shouldKeep(o){
if(数组isArray(o)){
返回长度
}else if(类型o==='object'){
返回o&&Object.keys(o.length)
}
返回o!=null
}
功能清洁(o){
if(数组isArray(o)){
o、 forEach(清洁)
变量a=o.filter(应保持)
o、 长度
对于(变量i=0;i

。作为控制台包装器{min height:100vh;}
您是否对如何修复上述代码中的错误感兴趣?您需要给出“empty”-[]、{}、[[]、[、]、''、false的定义