ES6属性值未定义的简写

时间:2018-06-07 12:25:39

标签: javascript ecmascript-6

我想使用属性值简写,但只有在定义了值时,请考虑以下示例:

const personByName = name => {
  const person = http(name)
  return { person, method: 'byName' }
}

personByName('john') // found person: { person: { name: 'john', age: 30 }, method: 'byName' }
personByName('paul') // not found: { method: 'byName' }

但我得到的当前输出是:

personByName('paul') // not found: { person: undefined, method: 'byName' }

4 个答案:

答案 0 :(得分:1)

我想你想要这样的东西:

const personByName = name => {
  const person = http(name);
  const result = { method: 'byName' };
  if (person) { result.person = person; }
  return result;
}

如果对象undefined没有声明属性,则不会跳过该对象。

答案 1 :(得分:1)

为了使用简写属性,可以使用Object.assign

const personByName = name => {
  const person = http(name);
  return Object.assign({ method: 'byName' }, person && { person });
}

后续的非对象Object.assign参数被有效忽略,因此虚假person不会影响结果。

如果预期person是一个对象,这将起作用,就像在原始代码中所示。

如果不允许使用未定义的值,则为:

Object.assign({ method: 'byName' }, person !== undefined && { person });

答案 2 :(得分:1)

在ES2018中,如果定义了a并且对象扩展以构建包含ab或仅b的对象,则可以使用三元运算符进行评估:



const a = 1
const b = { b: 2 }
const c = a ? { a, ...b } : b

console.log( c ) 






const a = undefined
const b = { b: 2 }
const c = a ? { a, ...b } : b

console.log( c ) 




答案 3 :(得分:0)

在 ES2018 中,即使没有“类型检查”也可以做到这一点

let a = { a: 1 }
let b = { b: 2 }
let c = undefined
let d = { d: 4 }

let x = {...a, ...b, ...c, ...d};      // {a: 1, b: 2, d: 4}
//                      ┗━━ undefined
console.log(x)

这适用于 falsy 变量。对“非空字符串”的一些注意:

let a = { a: 1 }
let b = { b: 2 }
let c = undefined // ━┓
let c1 = false    //  ╏
let c2 = 0        //  ╏
let c3 = -0       //  ┣╍ falsy
let c4 = 0n       //  ╏
let c5 = ''       //  ╏
let c6 = null     //  ╏
let c7 = NaN      // ━┛
let d = { d: 4 }

let x = {...a, ...b, ...c, ...c1, ...c2, ...c3, ...c4, ...c5, ...c6, ...c7, ...d}; 
//                      ┗━━━━━━━━━━━━━━━━━━━━ falsy ━━━━━━━━━━━━━━━━━━━━━┛
console.log(x)   // OK: {a: 1, b: 2, d: 4}

let t1 = true   
let t2 = 789
let y = {...a, ...b, ...t1, ...t2, ...d}; 
console.log(y)   // OK: {a: 1, b: 2, d: 4}

// Non empty string!
let t3 = 'abc'
let z = {...a, ...b, ...t3, ...d}; 
console.log(z)   // {0: "a", 1: "b", 2: "c", a: 1, b: 2, d: 4}
//                   ┗━━━━━━━ !!! ━━━━━━━┛