簡體   English   中英

在 function 中動態設置 JavaScript object 的屬性名稱

[英]Dynamically set property name of JavaScript object inside a function

我正在學習使用 Express 構建 API。 我想每次我必須發送成功的 JSON 響應時,我都必須復制大部分代碼。 因此,我嘗試將其放入 function 中,就像在我的 controller 模塊之一中一樣:

const successResponse = (res, statusCode, obj, coll = false) => {
  const successObj = { status: "success" };
  if (coll) successObj.results = obj.length;
  successObj.data = { obj };
  return res.status(statusCode).json(successObj);
};

exports.getPlayer = asyncErrorHandler(async (req, res, next) => {
  const player = await Player.findById(req.params.id);
  if (!player) return next(new AppError("Player not found", 404));

  successResponse(res, 200, player);
}

問題出在successObj.data = { obj }行中,我希望結果是作為鍵傳遞的參數的名稱,並將 object 作為值傳遞。 我目前得到的結果是:

{
    "status": "success",
    "data": {
        "obj": { // I want this key to be "player" here
            "name": "Sal"
        }
    }
}

正如評論所說,我希望密鑰是我作為 object 名稱傳遞的字符串。 我可以通過將另一個參數作為字符串傳遞來做到這一點,但它始終與我傳遞的 object 名稱相同。 有一個更好的方法嗎?

您將獲得一個 object 並嘗試將其用作鍵和值。 你可以嘗試這樣的事情:

假設你的 obj 是

var obj = { player: { 
            "name": "Sal"
        }}

然后在推送數據時,您可以按照以下步驟操作:

var selectedKey = Object.keys(obj)[0]; // assuming you will have a single key, if you have multiple then select based on the index

var selectedKeyData = Object.values(obj)[0];

var data = {};
data[selectedKey] = selectedKeyData;

現在,您的數據將獲得所需的結果。

您將名稱傳遞給successResponse,如下所示:

exports.getPlayer = asyncErrorHandler(async (req, res, next) => {
  const player = await Player.findById(req.params.id);
  if (!player) return next(new AppError("Player not found", 404));

  successResponse(res, 200, {objName: "player" , value: player);
}

然后像這樣改變你的successResponse:

// Set a suitable default value for objName (e.g. "obj") if you don't want to send it every time
const successResponse = (res, statusCode, {objName = "obj", value}, coll = false) => {
  const successObj = { status: "success" };
  if (coll) successObj.results = obj.length;
  successObj.data = { [objName]: {value}}; // { player : { name : "Sal"} }
  return res.status(statusCode).json(successObj);
};

編輯 1 => 注意:除非明確傳遞了名稱字符串,否則您無法訪問傳遞給 function 的變量的名稱。 因為僅傳遞變量所持有的值而不是名稱。 這就是為什么你必須傳遞它的名字。 我給出的解決方案不需要 function 的另一個參數,但它需要在 object 中傳遞另一個鍵/值。

**編輯 2 => ** 更清潔的解決方案

exports.getPlayer = asyncErrorHandler(async (req, res, next) => {
  const player = await Player.findById(req.params.id);
  if (!player) return next(new AppError("Player not found", 404));

  successResponse(res, 200, {player}); //Same as {"player" : player}
}

然后像這樣改變你的successResponse:

const successResponse = (res, statusCode, obj, coll = false) => {
  const successObj = { status: "success" };
  if (coll) successObj.results = obj.length;
  successObj.data = { ...obj };
  return res.status(statusCode).json(successObj);
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM