Javascript 如何删除对象中的falsy元素?
我正在尝试从此对象中删除属性Javascript 如何删除对象中的falsy元素?,javascript,object,Javascript,Object,我正在尝试从此对象中删除属性funky:false,并返回其他属性。这是我的代码,但由于某些原因,它不会删除我需要删除的项目 var user = { name: "ernest", age: 50, funky: false } function truthyObjLoop(user) { for (prop in user) { if (prop === false) { delete(prop); }
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);
}
}
}
prop
只是属性的名称。要将其从对象中删除,需要执行以下操作:
delete user[prop];
您还需要将
return
语句移到for
循环之外,否则它会在看到第一个非false属性时立即返回,而不会检查其他属性。当您在中使用for时,迭代变量被设置为属性名称,而不是值(与PHPforeach
不同)。您需要使用user[prop]
来获取值。此外,您应该在整个循环之后返回—您将在找到truthy属性后立即返回
function truthyObjLoop(user) {
for (prop in user) {
if (user[prop] === false) {
delete user[prop];
}
}
return user;
}
实际问题
delete
是一条语句,而不是函数。因此,您不必使用()
delete
语句从对象中删除属性。当您执行delete(prop)
操作时,它将无效。引用
delete
仅对对象的属性有效。它对变量或函数名没有影响。
解决方案
那么,如图所示,
要使用变量prop
删除对象的属性,应使用第二种形式
delete user[prop];
代码中的bug
除此之外,您的代码还有两个bug
如果当前属性的值不是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 }
更好的方法-避免突变
现在我们正在更改(改变)当前传递的对象。但是,更好的替代方法是构造一个新对象,没有您不想要的属性,就像这样
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 }
你真棒!谢谢你的帮助!