我想使用属性值简写,但只有在定义了值时,请考虑以下示例:
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' }
答案 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
并且对象扩展以构建包含a
和b
或仅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}
// ┗━━━━━━━ !!! ━━━━━━━┛