2017-09-14 57 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仍将包括在内。

当然,任何维护代码的人都不会立即明白为什么要这样做,他们很可能会认为您正在采取防御性副本以避免引用问题。