[英]How to check “truthyness” of an object, and then delete the falsy ones and edit the object
[英]How can I delete falsy elements in an Object?
我试图从该对象删除属性funky: false
并返回其他属性。 这是我的代码,但由于某种原因,它不会删除我需要删除的项目。
var user = {
name: "ernest",
age: 50,
funky: false
}
function truthyObjLoop(user) {
for (prop in user) {
if (prop === false) {
delete(prop);
} else {
return (user);
}
}
}
实际问题
delete
是一个语句而不是一个函数。 所以,你不必使用()
。
delete
语句从对象中删除属性。 当你delete(prop)
,它将没有任何效果。 引用MDN ,
delete
仅对对象的属性有效 。 它对变量或函数名称没有影响。
解
所以,如MDN delete
页面的语法部分所示,
delete object.property delete object['property']
要使用变量prop
删除对象的属性,您应该使用第二个表单
delete user[prop];
代码中的错误
除此之外,您的代码有两个错误。
如果当前属性的值不为false
,则立即返回。 您应该迭代所有属性,然后只需要返回。
你应该检查prop
的值,而不是prop
本身。
确保声明循环变量。 否则他们将成为全球财产。
所以,你的固定代码看起来像这样
function truthyObjLoop(user) {
// Note: we use `var prop`, otherwise `prop` will become a global variable.
for (var prop in user) {
// This condition is to prevent removing inherited properties
if (user.hasOwnProperty(prop) === false) {
continue;
}
if (user[prop] === false) {
delete user[prop];
}
}
}
truthyObjLoop(user);
console.log(user);
// { name: 'ernest', age: 50 }
更好的方法 - 避免变异
现在我们正在改变(变异)传递的当前对象。 但是,更好的替代方案是构造一个新对象,而不需要你不想要的属性,就像这样
function truthyObjLoop(user) {
var result = {};
for (var prop in user) {
if (user.hasOwnProperty(prop) === false) {
continue;
}
if (user[prop] !== false) {
result[prop] = user[prop];
}
}
return result;
}
console.log(truthyObjLoop(user));
// { name: 'ernest', age: 50 }
console.log(user);
// { name: 'ernest', age: 50, funky: false }
prop
只是该物业的名称。 要从您需要执行的对象中删除它:
delete user[prop];
您还需要在for
循环之外移动return
语句,否则它将在看到第一个非false属性时立即返回,而不是检查其他属性。
当你使用for-in
,迭代变量被设置为属性名,而不是值(它不像PHP foreach
)。 您需要使用user[prop]
来获取值。 此外,您应该在整个循环之后返回 - 一旦找到真正的属性,您就会返回。
function truthyObjLoop(user) {
for (prop in user) {
if (user[prop] === false) {
delete user[prop];
}
}
return user;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.