2017-09-14 54 views
1

這是常見的,我想建立一個對象,像這樣:創建對象 - 包括關鍵,如果值設置

const test = { 
    key1: value1, 
    key2: value2, 
    key3: value3, 
    key4: value4, 
} 

然而,如果說是value3如何undefined我可以簡潔地省略key3

目前我正在做這樣的事情:

const test = { 
    key1: value1, 
    key2: value2, 
    key4: value4, 
} 

if (value3) test.key3 = value3; 

但也有地方也有相當多的價值,可能是undefined,所以我想知道是否有一種方法可以只是沒有返回鍵的情況下如果值爲undefined以避免整個條件負載?

回答

2

您可以使用Object.keysArray.reduce只收集未未定義的值:

const test = { 
 
    key1: 'value1', 
 
    key2: 'value2', 
 
    key4: undefined, 
 
} 
 

 
const onlyPopulated = Object.keys(test).reduce((p, key) => { 
 
    if (typeof test[key] !== 'undefined') { 
 
    p[key] = test[key]; 
 
    } 
 
    return p; 
 
}, {}); 
 

 
console.log(onlyPopulated)

+0

這就是票。我之前沒有使用'reduce()'。好東西。 –

0

如果你能夠使用jQuery,那麼你可以使用擴展如下圖所示 http://api.jquery.com/jQuery.extend/

基本上,什麼擴展是合併提供到第一個對象的第二個對象。但是,它不合並空或未定義的屬性。所以我認爲它會很好地匹配你的用例,而且非常乾淨。

<html lang="en"> 
 
<head> 
 
    <meta charset="utf-8"> 
 
    <title>jQuery.extend demo</title> 
 
    <script src="https://code.jquery.com/jquery-1.10.2.js"></script> 
 
</head> 
 
<body> 
 
    
 
<div id="log"></div> 
 
    
 
<script> 
 
var object1 = { 
 
}; 
 
var test = { 
 
    key1: 1, 
 
    key2: 2, 
 
    key3: undefined, 
 
    key4: 4, 
 
} 
 
    
 
// Merge test into object1 
 
$.extend(object1, test); 
 
    
 
// Assuming JSON.stringify - not available in IE<8 
 
$("#log").append(JSON.stringify(object1)); 
 
</script> 
 
    
 
</body> 
 
</html>

0

在實踐中我可能會使用類似於其他答案已經提到的那些技術。然而,只是爲了好玩...

如果在你的對象中的所有值可以安全地轉換成JSON然後實現期望結果的簡潔的方式將使用stringifyparse

var data = { 
 
    key1: 'string', 
 
    key2: 34, 
 
    key3: undefined, 
 
    key4: [{key: 'nested'}], 
 
    key5: null 
 
}; 
 

 
data = JSON.parse(JSON.stringify(data)); 
 

 
console.log(data);

JSON.stringify跳過undefined,雖然它也跳過其他值類型,如函數。 null仍將包括在內。

當然,任何維護代碼的人都不會立即明白爲什麼要這樣做,他們很可能會認爲您正在採取防禦性副本以避免引用問題。