创建对象 - 如果值集,则包括密钥



我想建立这样的对象很常见:

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.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)

如果您能够使用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,那么实现所需结果的简洁方法将使用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仍将包括在内。

当然,要维护您这样做的任何人都不会立即清楚,他们很可能会假设您正在使用防御副本来避免参考问题。

相关内容

最新更新