我正在尝试删除未评估为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)
};
答案 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
时。它不会" 评估为真正的"如果变量是null
或undefined
。
有关问题的详细信息,请参阅此问题:
Which equals operator (== vs ===) should be used in JavaScript comparisons?
只需将===
运算符更改为==
,也无法解决问题。您将不得不更紧密地匹配问题定义,并检查不评估为 true 的内容。
此" 评估为真"概念在JS中如此常见,以至于它们直接将它构建到流控制语句中,如if
和while
:
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);