繁体   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