2010-07-21 80 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; 
});