我想建立这样的对象很常见:
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
以避免全部有条件的条件?
您可以将Object.keys
与Array.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)
如果您能够使用jQuery,则可以使用Extend,如下所示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>
在实践中,我可能会使用类似于其他答案中已经提到的技术。但是,只是为了好玩...
如果您的对象中的所有值都可以安全地转换为JSON,那么实现所需结果的简洁方法将使用stringify
和parse
:
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
仍将包括在内。
当然,要维护您这样做的任何人都不会立即清楚,他们很可能会假设您正在使用防御副本来避免参考问题。