【问题标题】:Can Javascript spread operator include undefined fields of an object?Javascript 扩展运算符可以包含对象的未定义字段吗?
【发布时间】:2019-06-10 18:39:57
【问题描述】:

有没有更易读的方式将一个对象的未定义字段传播到另一个对象上,而不遍历它的每个元素?

以下示例将对象A 传播到对象B

let A = { f1:'Foo', f2:'Bar', f3:'Baz' }
let B = { ...A }
// Now B has the value of { f1:'Foo', f2:'Bar', f3:'Baz' }

但是,在以下示例中,展开运算符将不包含未定义的值:

let A = { f1:'Foo', f2:undefined, f3:'Baz' }
let B = { ...A }
// Now B has the value of { f1:'Foo', f3:'Baz' }
// I would like it to be spread like { f1:'Foo', f2:undefined, f3:'Baz' } 
// or { f1:'Foo', f2:null, f3:'Baz' }

有没有一种方法可以使用扩展运算符投影具有undefined 值的字段? (显然没有遍历对象A 的每个字段并传播到B,如果该字段的值不是undefined

【问题讨论】:

  • 我无法重现问题。 let A = { f1:'Foo', f2:undefined, f3:'Baz' } let B = { ...A } 这只是给了我预期的结果。
  • 您的断言不正确。如果A 有一个字段f2 具有any 值,包括undefined,它将被点差复制到B(这不是真正的运算符,因为这是值得的) .
  • 哦,对了。。我猜是Express.js,不包括使用Response::json()时未定义的字段
  • @iGoodie 这是因为 undefined 在 JSON 中不是合法值,尽管它是 JS 文字中键的合法值。
  • 请注意,虽然 undefined 是非法的,但 null 是 JSON 中的有效值

标签: javascript operators spread-syntax


【解决方案1】:

如果您询问展开运算符是否会维护未定义的属性值“展开后”,它们会。

const original = { one: 1, two: 2, three: undefined, four: null };
console.log(original);
const withSpread = {five: 5, ...original };
console.log(withSpread);
console.log(typeof withSpread.three === 'undefined')

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax

【讨论】:

    【解决方案2】:

    结果证明我的断言无效。传播运算符确实传播具有undefined 值的字段。是 JSON.stringify() 删除了我的一个来源中的这些字段,这导致我的断言无效。

    对于Express.js 用户;您可以使用app.set('json replacer', (k, v) => v===undefined ? null : v);undefined 值替换为null 来让表达字符串化您的json 响应

    或者同样,您可以使用JSON.stringify({...}, (k, v) => v===undefined ? null : v)undefined 值替换为null 来使其字符串化

    【讨论】:

      猜你喜欢
      • 2021-05-21
      • 2017-11-15
      • 2011-07-27
      • 2011-04-03
      • 1970-01-01
      • 2021-04-09
      • 1970-01-01
      相关资源
      最近更新 更多