2010-07-21 74 views
5

所以我写一个简短的函数删除的对象成员有falsy值:从JavaScript对象中删除胸垫

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

几天后我检查源代码控制,有人已经把它改为:

var newObject = {}; 
for (var key in object) { 
    if (object[key]) { newObject[key] = object[key]; } 
} 
return newObject; 

没有关于入住的意见,这家伙今天不在工作。

哪个实施更好?每种方法的性能影响是什么?

回答

3

您无法从它从原型继承的对象上删除属性。因此,在某些情况下,您的代码可能无法按预期工作。

Source

2

你不能delete它从一个prototype继承(尽管你可以在原型上直接删除)一个对象的属性。

在第二个示例中,从prototype继承的虚假属性不会被复制到newObject

延伸阅读:

0

我觉得你的代码读取更直观。也许他只是不想改变原来的对象?

+0

不是真的,看到丹尼尔和Yacoby的答案。 – 2010-07-21 22:04:44

+2

这些答案和我的并不相互排斥。那么,至少他们可能不是。我们没有足够的背景来做出决定。 – 2010-07-21 22:10:52

1

使用Lo-Dash,考虑(使用_.pick)此实现:

var newObject = _.pick(object, function onlyTruthy(val, key) { 
    return !!val; 
});