对象的可选添加的简单表示法?
Easy Notation for Optional Addition to an Object?
我有一个服务,其中包含一些可选的输入,这些输入取决于调用该服务的表单。如果我尝试 运行 这没有 sid 和 eid 输入,实际的 .add({}) 到 firestore 并出现关于字段未定义的错误,这是有道理的。
Unsupported field value: undefined (found in field eventId in document
所以,我可以想到几种使用各种表达式和 if 语句的方法,或者在可以从不同位置调用的服务上编写 2 个不同的变体,但我希望有一个更优雅的解决方案。
有没有简单的方法,比如'?'您可以在界面或输入中使用来指示该字段是可选的吗?
喜欢:{ ...inventoryAdd, ...timestamp, ...?sessionId, ...?eventId }
或者,我是否只需要编写一些逻辑,或者将函数拆分为两个?
addInventory(inventoryAdd: any, pid: string, sid?: string, eid?: any) {
const inventoryCollectionRef = this.afs.collection("/Party-Management/" + pid + "/Party-Inventory");
const timestamp = { timestamp: firebase.firestore.FieldValue.serverTimestamp() }
const sessionId = { sessionId: sid}
const eventId = { eventId: eid }
inventoryCollectionRef.add({ ...inventoryAdd, ...timestamp, ...sessionId, ...eventId })
}
我可能只使用 if
语句(但请继续阅读):
addInventory(inventoryAdd: any, pid: string, sid?: string, eid?: any) {
const inventoryCollectionRef = this.afs.collection("/Party-Management/" + pid + "/Party-Inventory");
const toAdd = {
...inventoryAdd,
timestamp: firebase.firestore.FieldValue.serverTimestamp(),
};
if (sid) {
toAdd.sessionId = sid;
}
if (eid) {
toAdd.eventId = eid;
}
inventoryCollectionRef.add(toAdd);
}
但是如果你想用表达式来代替,传播 null
是一个 no-op,所以你可以将 sessionId
/eventId
设置为 null
当你没有 sid
/eid
时(见 ***
):
addInventory(inventoryAdd: any, pid: string, sid?: string, eid?: any) {
const inventoryCollectionRef = this.afs.collection("/Party-Management/" + pid + "/Party-Inventory");
const timestamp = { timestamp: firebase.firestore.FieldValue.serverTimestamp() };
const sessionId = sid ? { sessionId: sid} : null; // ***
const eventId = eid ? { eventId: eid } : null; // ***
inventoryCollectionRef.add({ ...inventoryAdd, ...timestamp, ...sessionId, ...eventId });
}
传播 undefined
也是一个 no-op,就像传播一个空字符串一样,所以你也可以这样做(参见 ***
):
addInventory(inventoryAdd: any, pid: string, sid?: string, eid?: any) {
const inventoryCollectionRef = this.afs.collection("/Party-Management/" + pid + "/Party-Inventory");
const timestamp = { timestamp: firebase.firestore.FieldValue.serverTimestamp() };
const sessionId = sid && { sessionId: sid}; // ***
const eventId = eid && { eventId: eid }; // ***
inventoryCollectionRef.add({ ...inventoryAdd, ...timestamp, ...sessionId, ...eventId });
}
之所以可行,是因为 x && y
计算 x
,如果 x
是 falsy,则取该值作为结果,否则它计算 y
并取那个作为它的结果。所以如果 sid
/eid
是 undefined
或 ""
, sessionId
/eventId
是 undefined
或 ""
(并且传播它们不会在对象中放置任何东西);否则,它们就是对象,展开它们会将它们的属性添加到对象中。
我有一个服务,其中包含一些可选的输入,这些输入取决于调用该服务的表单。如果我尝试 运行 这没有 sid 和 eid 输入,实际的 .add({}) 到 firestore 并出现关于字段未定义的错误,这是有道理的。
Unsupported field value: undefined (found in field eventId in document
所以,我可以想到几种使用各种表达式和 if 语句的方法,或者在可以从不同位置调用的服务上编写 2 个不同的变体,但我希望有一个更优雅的解决方案。
有没有简单的方法,比如'?'您可以在界面或输入中使用来指示该字段是可选的吗?
喜欢:{ ...inventoryAdd, ...timestamp, ...?sessionId, ...?eventId }
或者,我是否只需要编写一些逻辑,或者将函数拆分为两个?
addInventory(inventoryAdd: any, pid: string, sid?: string, eid?: any) {
const inventoryCollectionRef = this.afs.collection("/Party-Management/" + pid + "/Party-Inventory");
const timestamp = { timestamp: firebase.firestore.FieldValue.serverTimestamp() }
const sessionId = { sessionId: sid}
const eventId = { eventId: eid }
inventoryCollectionRef.add({ ...inventoryAdd, ...timestamp, ...sessionId, ...eventId })
}
我可能只使用 if
语句(但请继续阅读):
addInventory(inventoryAdd: any, pid: string, sid?: string, eid?: any) {
const inventoryCollectionRef = this.afs.collection("/Party-Management/" + pid + "/Party-Inventory");
const toAdd = {
...inventoryAdd,
timestamp: firebase.firestore.FieldValue.serverTimestamp(),
};
if (sid) {
toAdd.sessionId = sid;
}
if (eid) {
toAdd.eventId = eid;
}
inventoryCollectionRef.add(toAdd);
}
但是如果你想用表达式来代替,传播 null
是一个 no-op,所以你可以将 sessionId
/eventId
设置为 null
当你没有 sid
/eid
时(见 ***
):
addInventory(inventoryAdd: any, pid: string, sid?: string, eid?: any) {
const inventoryCollectionRef = this.afs.collection("/Party-Management/" + pid + "/Party-Inventory");
const timestamp = { timestamp: firebase.firestore.FieldValue.serverTimestamp() };
const sessionId = sid ? { sessionId: sid} : null; // ***
const eventId = eid ? { eventId: eid } : null; // ***
inventoryCollectionRef.add({ ...inventoryAdd, ...timestamp, ...sessionId, ...eventId });
}
传播 undefined
也是一个 no-op,就像传播一个空字符串一样,所以你也可以这样做(参见 ***
):
addInventory(inventoryAdd: any, pid: string, sid?: string, eid?: any) {
const inventoryCollectionRef = this.afs.collection("/Party-Management/" + pid + "/Party-Inventory");
const timestamp = { timestamp: firebase.firestore.FieldValue.serverTimestamp() };
const sessionId = sid && { sessionId: sid}; // ***
const eventId = eid && { eventId: eid }; // ***
inventoryCollectionRef.add({ ...inventoryAdd, ...timestamp, ...sessionId, ...eventId });
}
之所以可行,是因为 x && y
计算 x
,如果 x
是 falsy,则取该值作为结果,否则它计算 y
并取那个作为它的结果。所以如果 sid
/eid
是 undefined
或 ""
, sessionId
/eventId
是 undefined
或 ""
(并且传播它们不会在对象中放置任何东西);否则,它们就是对象,展开它们会将它们的属性添加到对象中。