我试图循环对象中的所有属性并删除所有虚假的属性,然后返回使用
delete
传入的对象。显然我做错了什么......这是我到目前为止编写的代码。
var obj = {
a: undefined,
b: "banana",
c: 0,
d: false,
e: "",
f: "apple",
g: 23
}
var truthy = function (obj) {
for (var i in obj) {
if (obj[i] === null || obj[i] === undefined) {
delete obj[i];
}
} return obj;
}
这是实际问题: 创建一个函数,它接受一个对象,循环遍历它的所有属性,并删除任何虚假的属性。然后返回传入的对象。(提示:删除)
if (!obj[i])
。当然,假设这就是您想要的,但不考虑 false
“虚假”有点愚蠢。您的实际问题是什么?
我会做
_.pickBy(obj, _.identity);
它将返回仅包含真值的对象
此处演示:
var obj = {
a: undefined,
b: "banana",
c: 0,
d: false,
e: "",
f: "apple",
g: 23
}
var truthy = function (obj) {
for (var i in obj) {
if (!obj[i]) {
delete obj[i];
}
}
return obj;
};
console.log(truthy(obj));
因为您使用
===
所以 null
(''
) 不等于 false
,您的代码只需使用 false
和 undefined
删除键即可。
根据 MDN,
falsy
的意思是:
” 假值是在布尔上下文中计算时转换为 false 的值。
JavaScript 在布尔上下文中使用类型强制。 ”
if (false)
if (null)
if (undefined)
if (0)
if (NaN)
if ('')
if (document.all) [1]
因此,如果您想删除所有
falsy
值,请将条件更改为 if (!obj[i])
,以检查虚假值并在下一行中删除。
参考:
不完全是OP要求的,但相关,并且与问题标题匹配。这会删除所有虚假值,但返回一个新对象,而不是改变现有对象。如果我不需要递归,这是我通常使用的。
const removeFalsy = (o: object) => {
return Object.entries(o).reduce((a,[k,v]) => ( !v ? a : (a[k]=v, a)), {})
}
对于偶然发现这个答案并需要这个答案的人来说可能有用。