Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何删除对象中的falsy元素?_Javascript_Object - Fatal编程技术网

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时,迭代变量被设置为属性名称,而不是值(与PHP
foreach
不同)。您需要使用
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 }
    

    你真棒!谢谢你的帮助!