NODEJS对象值是键值对

slmsl1lt  于 2023-06-22  发布在  Node.js
关注(0)|答案(2)|浏览(121)

我有一个通过webhook接收的请求,它返回以下对象作为req.body:

{"appId":"7HPEPVBTZGDCP","merchants":{"6RDH804A896K1":[{"objectId":"O9FN4R9BMKXQ0","type":"UPDATE","ts":1686754357822},{"objectId":"OE87DT9330H7R","type":"UPDATE","ts":1686754358007}]}}

我遇到的问题是,虽然我可以通过req.body.merchants访问商家,这是一个键/值对,键是字符串,值是数组:

{"6RDH804A896K1":[{"objectId":"O9FN4R9BMKXQ0","type":"UPDATE","ts":1686754357822},{"objectId":"OE87DT9330H7R","type":"UPDATE","ts":1686754358007}]}

我遇到的问题是,我需要一种方法来访问商家的密钥6RD8H04A896K1,以及以下值:

[{"objectId":"O9FN4R9BMKXQ0","type":"UPDATE","ts":1686754357822},{"objectId":"OE87DT9330H7R","type":"UPDATE","ts":1686754358007}]

我尝试了以下方法,但没有成功:

const merchantResponse: { id : value} = req.body.merchants;

但这似乎也不管用有人能告诉我如何将这个嵌套的键/值对转换为JSON对象并访问其值吗?问题是我没有对象键,否则我可以将其称为:

const merchantResponse = req.body['6RDH804A896K1'];

有人有解决这个问题的办法吗?

lg40wkob

lg40wkob1#

如果你需要得到merchants,你知道你至少需要抓住那个键。
只需获取对象值并访问第一个值。

const req = {
  body: {
    "appId": "7HPEPVBTZGDCP",
    "merchants": {
      "6RDH804A896K1": [{
        "objectId": "O9FN4R9BMKXQ0",
        "type": "UPDATE",
        "ts": 1686754357822
      }, {
        "objectId": "OE87DT9330H7R",
        "type": "UPDATE",
        "ts": 1686754358007
      }]
    }
  }
}

const getNestedData = (root, key) => ({ [key]: Object.values(root[key])[0] });

console.log(getNestedData(req.body, 'merchants'));
.as-console-wrapper { top: 0; max-height: 100% !important; }

TypeScript方式

如果你在TypeScript中这样做,你可以尝试:

const req = {
  body: {
    "appId": "7HPEPVBTZGDCP",
    "merchants": {
      "6RDH804A896K1": [{
        "objectId": "O9FN4R9BMKXQ0",
        "type": "UPDATE",
        "ts": 1686754357822
      }, {
        "objectId": "OE87DT9330H7R",
        "type": "UPDATE",
        "ts": 1686754358007
      }]
    }
  }
};

type UpdateType = 'CREATE' | 'DELETE' | 'UPDATE';

interface Merchant {
  objectId: string,
  type: UpdateType,
  ts: number
};

function unwrapMerchants(root: object): Merchant[] {
  return Object.values(root)[0] as Merchant[];
}

const pair = { merchants: unwrapMerchants(req.body.merchants) };

console.log(pair);

在看到你的问题的答案后,你可以弹出条目中的第一个条目,并将它们的键值对解构为变量,如下所示:

const req = {
  body: {
    "appId": "7HPEPVBTZGDCP",
    "merchants": {
      "6RDH804A896K1": [{
        "objectId": "O9FN4R9BMKXQ0",
        "type": "UPDATE",
        "ts": 1686754357822
      }, {
        "objectId": "OE87DT9330H7R",
        "type": "UPDATE",
        "ts": 1686754358007
      }]
    }
  }
}
const [merchantId, response] = Object.entries(req.body.merchants).pop();

console.log({ merchantId, response });
.as-console-wrapper { top: 0; max-height: 100% !important; }

带有可选链接和防护装置的安全版本:

const [merchantId, response] = Object.entries(req?.body?.merchants ?? {})?.pop() ?? [];
zed5wv10

zed5wv102#

事实证明,有一种方法可以在不知道键的情况下获得键/值对的值,即首先将其转换为数组。可能不是最好的,但以下是我的解决方案。

const notify = req.body;
    let merchantId = Object.entries(notify.merchants)[0][0];
    let response = Object.entries(notify.merchants)[0][1]

这将merchantId设置为“6 RDH 804 A896 K1”,这就是我试图做的。

相关问题