我正在尝试从此对象中删除属性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);
}
}
}
答案 0 :(得分:4)
实际问题
delete
是一个声明,而不是一个函数。因此,您不必使用()
。
delete
语句从对象中删除属性。执行delete(prop)
时,它将无效。引用MDN,
delete
仅对对象的属性有效。 对变量或函数名称没有影响。
<强>解决方案强>
所以,如syntax section of MDN's delete
page所示,
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 }
答案 1 :(得分:2)
prop
只是该属性的名称。要从您需要执行的对象中删除它:
delete user[prop];
您还需要将return
语句移到for
循环之外,否则它会在看到第一个非虚假属性后立即返回,而不会检查其他属性。
答案 2 :(得分:1)
使用for-in
时,迭代变量设置为属性名称,而不是值(它不像PHP foreach
)。您需要使用user[prop]
来获取值。此外,您应该在整个循环之后返回 - 一旦找到真正的属性,您就会返回。
function truthyObjLoop(user) {
for (prop in user) {
if (user[prop] === false) {
delete user[prop];
}
}
return user;
}