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

时间:2015-06-05 21:19:49

标签: javascript 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);
        }
    }
}

3 个答案:

答案 0 :(得分:4)

实际问题

  1. delete是一个声明,而不是一个函数。因此,您不必使用()

  2. delete语句从对象中删除属性。执行delete(prop)时,它将无效。引用MDN

      

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

  3. <强>解决方案

    所以,如syntax section of MDN's delete page所示,

    delete object.property
    delete object['property']
    

    要使用变量prop删除对象的属性,您应该使用第二种形式

    delete user[prop];
    

    代码中的错误

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

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

    2. 您实际上应该检查prop的值,而不是prop本身。

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

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

      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;
}