【问题标题】:creating objects - include key if value set创建对象 - 如果设置了值,则包括键
【发布时间】:2017-09-14 23:43:59
【问题描述】:

我想像这样构建一个对象很常见:

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

但是,如果value3undefined,我怎么能简洁地省略key3

目前我正在做类似的事情:

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

if (value3) test.key3 = value3;

但是在某些情况下,有很多值可能是 undefined,所以我想知道如果值是 undefined,是否有办法不返回键以避免大量条件?

【问题讨论】:

    标签: javascript object javascript-objects


    【解决方案1】:

    您可以使用 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)

    【讨论】:

    • 这就是票。我以前没用过reduce()。好东西。
    【解决方案2】:

    如果你能够使用 jQuery,那么你可以使用如下所示的扩展 http://api.jquery.com/jQuery.extend/

    基本上,extend 所做的是将提供的第二个对象合并到第一个对象中。但是,它不会合并 null 或未定义的属性。所以我认为它会很好地匹配您的用例并且非常干净。

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

    【讨论】:

      【解决方案3】:

      在实践中,我可能会使用类似于其他答案中已经提到的技术。不过,只是为了好玩……

      如果您的对象中的所有值都可以安全地转换为 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 仍会包含在内。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-13
        • 1970-01-01
        • 2012-11-17
        • 2017-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多