繁体   English   中英

如何删除对象中的虚假元素?

[英]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);
        }
    }
}

实际问题

  1. delete是一个语句而不是一个函数。 所以,你不必使用()

  2. delete语句从对象中删除属性。 当你delete(prop) ,它将没有任何效果。 引用MDN

    delete仅对对象的属性有效 它对变量或函数名称没有影响。

所以,如MDN delete页面语法部分所示,

 delete object.property delete object['property'] 

要使用变量prop删除对象的属性,您应该使用第二个表单

delete user[prop];

代码中的错误

除此之外,您的代码有两个错误。

  1. 如果当前属性的值不为false ,则立即返回。 您应该迭代所有属性,然后只需要返回。

  2. 你应该检查prop的值,而不是prop本身。

  3. 确保声明循环变量。 否则他们将成为全球财产。

所以,你的固定代码看起来像这样

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM