网站搜索

javascript - 有更好的方法向对象添加可选值吗?


目前我正在使用类似这样的方式进行可选的添加

  ...(!!providerId && { providerId }),
  ...(!!practiceId && { practiceId }),

有没有某种简写逻辑可以优雅地替代这个逻辑,就像

 yield createRemarkRequest.post(PATIENT_REMARK, {
  patientId,
  ?providerId,
  ?practiceId,
  noteTypeCode,
  note,
})

答案#1

你正在做的事情是可以的(假设你不需要包含 0 或 "" 等;如果需要的话,你就需要用别的方法,而不是 !! 检查)。它依赖于 Boolean 对象上没有自有的、可枚举的属性,但没关系,确实没有。:-) 我在一些代码里确实这样做过,不过不常见。

但直接明确表达可能会更清楚:

const appropriateNameHere = {
    patientId,
    noteTypeCode,
    note,
};
if (providerId) {
    appropriateNameHere.providerId = providerId;
}
if (practiceId) {
    appropriateNameHere.practiceId = practiceId;
}
yield createRemarkRequest.post(PATIENT_REMARK, appropriateNameHere);

(这也让调试变得更容易一些。)

或者如果 createRemarkRequest.post 忽略 undefined 属性值,你可以这样做:

yield createRemarkRequest.post(PATIENT_REMARK, {
    patientId,
    providerId: providerId ? providerId : undefined,
    practiceId: practiceId ? practiceId : undefined,
    noteTypeCode,
    note,
});

答案#2

关键是使用变量 || undefined

yield createRemarkRequest.post(PATIENT_REMARK, {
  patientId,
  providerId: providerId || undefined,
  practiceId: practiceId || undefined,
  noteTypeCode,
  note,
})

请注意,该条件在值为空数组或空对象时不起作用。例如:

const resultValueOption3 = {
    propZero: propZero || undefined,
    propNull: propNull || undefined,
    propEmptyArray: propEmptyArray || undefined,
    propEmptyObject: propEmptyObject || undefined,
    propEmptyString: propEmptyString || undefined,
    propFalse: propFalse || undefined,
    propTrue: propTrue || undefined,
  };

result: {"propEmptyArray":[],"propEmptyObject":{},"propTrue":true}

最后,我编写了包含多种组合的完整代码,结果如下:

export function Question11() {

  const propZero = 0;
  const propNull = null;
  const propEmptyArray = [];
  const propEmptyObject = {};
  const propEmptyString = "";
  const propFalse = false;
  const propTrue = true;

  const resultValueOption1 = {
    propZero: propZero ?? null,
    propNull: propNull ?? null,
    propEmptyArray: propEmptyArray ?? null,
    propEmptyObject: propEmptyObject ?? null,
    propEmptyString: propEmptyString ?? null,
    propFalse: propFalse ?? null,
    propTrue: propTrue ?? null,
  };

  const resultValueOption2 = {
    propZero: propZero ?? undefined,
    propNull: propNull ?? undefined,
    propEmptyArray: propEmptyArray ?? undefined,
    propEmptyObject: propEmptyObject ?? undefined,
    propEmptyString: propEmptyString ?? undefined,
    propFalse: propFalse ?? undefined,
    propTrue: propTrue ?? undefined,
  };

  const resultValueOption3 = {
    propZero: propZero || undefined,
    propNull: propNull || undefined,
    propEmptyArray: propEmptyArray || undefined,
    propEmptyObject: propEmptyObject || undefined,
    propEmptyString: propEmptyString || undefined,
    propFalse: propFalse || undefined,
    propTrue: propTrue || undefined,
  };

  const resultValueOption4 = {
    propZero: propZero || null,
    propNull: propNull || null,
    propEmptyArray: propEmptyArray || null,
    propEmptyObject: propEmptyObject || null,
    propEmptyString: propEmptyString || null,
    propFalse: propFalse || null,
    propTrue: propTrue || null,
  };

  return (
    <div>
      <div>Option1</div>
      <div>{JSON.stringify(resultValueOption1)}</div>
      <div>Option2</div>
      <div>{JSON.stringify(resultValueOption2)}</div>
      <div>Option3</div>
      <div>{JSON.stringify(resultValueOption3)}</div>
      <div>Option4</div>
      <div>{JSON.stringify(resultValueOption4)}</div>
    </div>
  );
}

/*
  results:
    Option1
     {"propZero":0,"propNull":null,"propEmptyArray":[],"propEmptyObject":{},"propEmptyString":"","propFalse":false,"propTrue":true}
    Option2
     {"propZero":0,"propEmptyArray":[],"propEmptyObject":{},"propEmptyString":"","propFalse":false,"propTrue":true}
    Option3
     {"propEmptyArray":[],"propEmptyObject":{},"propTrue":true}
    Option4
     {"propZero":null,"propNull":null,"propEmptyArray":[],"propEmptyObject":{},"propEmptyString":null,"propFalse":null,"propTrue":true}
*/

我希望我帮到了你。