JavaScript的入门者,请多多包涵。
我正在尝试创建一个程序,该程序将检查对象是否为空,空或未定义的值。它似乎在大多数情况下都可以正常工作,但是当对象中有一个数组时,填充它时会将其显示为“空项目”。
有人可以告诉我如何更改我的代码,以便它检查数组是否真正为空吗?
我的代码如下:
const myObj =
{ "tags": ["A", "B", "C"],
"shared_with": ["abc", "123"],
"list": [],
"public_jobs": true,
"config": null,
"id": 9406,
"name": "",
}
const removeNotEmpty = (obj) => {
Object.keys(obj).forEach(k => {//for each property of the object
if(typeof obj[k] === 'object' && obj[k] !== null){//if the property is an object
removeNotEmpty(obj[k]);//recurse
}else if(obj[k]){//if property is truthy
delete obj[k];//remove it from the object
}else if(obj[k] == !obj.length){
delete obj[k];
}
});
return obj;
};
// make sure to copy the object if you don't want to modify the first
// (that's what the Object.assign is for)
console.log(removeNotEmpty(Object.assign({},myObj)));
谢谢。
编辑:因此,我根据以下建议对代码进行了一些修改,这就是我的代码了。
const myObj =
{ "tags": ["A", "B", "C"],
"shared_with": ["abc", "123"],
"list": [],
"public_jobs": true,
"config": null,
"id": 9406,
"name": "",
}
const removeNotEmpty = (obj) => {
Object.keys(obj).forEach(k => {//for each property of the object
if(Object.prototype.toString.call(obj[k]) === '[object Array]'){
delete obj[k];
}else if(typeof obj[k] === 'object' && obj[k] !== null){//if the property
IS an object
removeNotEmpty(obj[k]);//recurse)
}else if(obj[k]){//if property is truthy
delete obj[k];//remove it from the object
}
});
return obj;
};
console.log(removeNotEmpty(Object.assign({},myObj)));//make sure to copy the
object if you don't want to modify the first (that's what the Object.assign
is for)
现在的问题是它不显示空数组,例如“ list:[]”?有什么想法的人吗?
答案 0 :(得分:2)
因为在JS中,数组是一个对象。
因此,"tags": ["A", "B", "C"]
将转到第一个If子句。因为它是一个对象,也不为空。而且,如果您使用Object.keys
迭代数组,它将返回索引为Keys
。
因此,您需要一个条件来检查键是否为数组。可以通过
Array.isArray(obj[k])
或
Object.prototype.toString.call(obj[k]) === '[object Array]';
编辑: 随意将其添加到第一个if子句中。
Object.keys(obj).forEach(k => {
if(Object.prototype.toString.call(obj[k]) === '[object Array]' && obj[k].length >0 ){
//delete stuff
}else if(...//remaining code
.
.
.
});
答案 1 :(得分:0)
看起来您正在寻找错误的值或空数组。
Object.entries(myObj).forEach(([k, v]) => {
if (!v || (Array.isArray(v) && v.length === 0)) {
console.log(`${k} is falsy or an empty array`)
}
})
答案 2 :(得分:0)
通读3次,我仍然不知道您要达到什么目的,但是如果问题是检测到空数组(仅空数组而不是未定义或空值填充的数组),那么它将起作用:
Array.isArray(suspectingThisIsArray) && suspectingThisIsArray.length == 0
这将检查可疑对象是否为数组,如果不是,则将其短路。如果是,则检查它是否为空。如果为空,则整个表达式为真。
这是您想要检测的吗?