尝试从对象中删除false属性

时间:2016-06-23 07:29:49

标签: javascript

我正在尝试删除未评估为true的对象属性。我做错了什么?

var object = {
  obj1: NaN,
  obj2: false,
  obj3: "Don't delete",
  obj4: "Please don't delete"

};

var onlyTruthy = function(object) {
  for (var key in object) {
    if (object[key] === false) {
      delete object[key];
    }
  }
  return(object)
};

4 个答案:

答案 0 :(得分:5)

要删除所有falsy属性,只需检查值即可。

if (!object[key]) {
    delete object[key];
}

使用支票object[key] === false,您可以与false进行严格比较。这意味着,将根据类型(布尔值)和相同的值检查该值。但是你需要 - 更少 - 更少。只是检查一个不真实的价值。

请注意,值0的属性也会被删除。

工作代码:

var object = { obj1: NaN, obj2: false, obj3: "Don't delete", obj4: "Please don't delete" },
    onlyTruthy = function (object) {
        for (var key in object) {
            if (!object[key]) {
                delete object[key];
            }
        }
        return object;
    };

onlyTruthy(object);
console.log(object);

答案 1 :(得分:0)

只需使用if(!object [key])来表示真值,而无需与精确的伪值进行比较。

答案 2 :(得分:0)

  

我试图删除不评估为true的对象属性。我做错了什么?

问题是您使用的是the "identity" or "strict equality" operator: ===而不是the normal "equality" operator: ==。当你提出这个问题时,你不允许程序进行任何形式的处理吗?这两件事情是一样的吗?"。

以下是一些例子:

 1   ==  1        // true
"1"  ==  1        // true
 1   == '1'       // true
 0   == false     // true
 0   == null      // false

 0   == undefined // false
null == undefined // true

VS

3 === 3   // true
3 === '3' // false!

当您撰写... === false时,唯一一次将" 评估为真"当变量实际上等于false时。它不会" 评估为真正的"如果变量是nullundefined

有关问题的详细信息,请参阅此问题:

Which equals operator (== vs ===) should be used in JavaScript comparisons?

只需将===运算符更改为==,也无法解决问题。您将不得不更紧密地匹配问题定义,并检查评估为 true 的内容。

此" 评估为真"概念在JS中如此常见,以至于它们直接将它构建到流控制语句中,如ifwhile

if (... something that evaluates to true ...) {
   // ... do something
}

while (... something that evaluates to true ...) {
   // ... do something
}

如果你将它与the logical not operator结合使用,那么你可以使用同样的"评估为真"检查以查找评估为true的内容:

if (!object[key]) {
  delete object[key];
}

这是"权利"在Javascript(或至少the most "canonical")中做事的方式。

答案 3 :(得分:0)

由于对delete performance的讨论,如果只想过滤不需要的属性而不介意使用新变量,这将是一个很好的答案:

var object = { obj1: NaN, obj2: false, obj3: "Don't delete", obj4: "Please don't delete" },
    result = {};
Object.keys(object).forEach(k => object[k] && (result[k] = object[k]));

console.log(result);