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的定义