【问题标题】:Access value of array object NodeJS数组对象NodeJS的访问值
【发布时间】:2021-10-22 01:27:12
【问题描述】:

我想我快疯了...我只是想为 NodeJS 做一些基本的 API 学习,我已经掌握了这个,它可以正常工作并在控制台上打印“United States Dollar”...

app.get("/", function(req, res){

  const url = "https://api.coindesk.com/v1/bpi/currentprice.json"
  https.get(url, function(response){
    console.log(response.statusCode);

    response.on("data", function(data){
      const priceData = JSON.parse(data);
      console.log(priceData.bpi.USD.description);
    })
  })

但是当我试图通过像这样使用 USD 的数组位置(即 [0])来访问它时...

app.get("/", function(req, res){

  const url = "https://api.coindesk.com/v1/bpi/currentprice.json"
  https.get(url, function(response){
    console.log(response.statusCode);

    response.on("data", function(data){
      const priceData = JSON.parse(data);
      console.log(priceData.bpi[0].description);
    })
  })

我崩溃了……

TypeError: Cannot read property 'description' of undefined

JSON 是

{
  "time": {
    "updated": "Oct 21, 2021 16:10:00 UTC",
    "updatedISO": "2021-10-21T16:10:00+00:00",
    "updateduk": "Oct 21, 2021 at 17:10 BST"
  },
  "disclaimer": "This data was produced from the CoinDesk Bitcoin Price Index (USD). Non-USD currency data converted using hourly conversion rate from openexchangerates.org",
  "chartName": "Bitcoin",
  "bpi": {
    "USD": {
      "code": "USD",
      "symbol": "$",
      "rate": "63,222.0050",
      "description": "United States Dollar",
      "rate_float": 63222.005
    },
    "GBP": {
      "code": "GBP",
      "symbol": "£",
      "rate": "45,779.4964",
      "description": "British Pound Sterling",
      "rate_float": 45779.4964
    },
    "EUR": {
      "code": "EUR",
      "symbol": "€",
      "rate": "54,306.7540",
      "description": "Euro",
      "rate_float": 54306.754
    }
  }
}

USD 对象是 bpi 数组的 position[0] (对吗?)那么为什么我不能像上面那样点击它呢? This example 看起来和我的很相似,所以看不出我哪里出错了?

【问题讨论】:

  • bpi 包含一个对象,而不是一个数组,所以位置 0 不存在,试试BPI.USD.description
  • 感谢这真的很有帮助

标签: node.js


【解决方案1】:

问题是priceData.bpi的内容不是数组[],而是对象{},所以不能按位置访问USD,唯一的访问方式是priceData.bpi.USD

更多关于 JS arrays, objects.


但是,如果确实需要按位置访问,可以使用Object.entries()方法将priceData.bpi的内容转换成数组。

示例

let priceData = {"time":{"updated":"Oct 21, 2021 16:39:00 UTC","updatedISO":"2021-10-21T16:39:00+00:00","updateduk":"Oct 21, 2021 at 17:39 BST"},"disclaimer":"This data was produced from the CoinDesk Bitcoin Price Index (USD). Non-USD currency data converted using hourly conversion rate from openexchangerates.org","chartName":"Bitcoin","bpi":{"USD":{"code":"USD","symbol":"$","rate":"63,340.4233","description":"United States Dollar","rate_float":63340.4233},"GBP":{"code":"GBP","symbol":"£","rate":"45,865.2439","description":"British Pound Sterling","rate_float":45865.2439},"EUR":{"code":"EUR","symbol":"€","rate":"54,408.4735","description":"Euro","rate_float":54408.4735}}}

let bpiArr = Object.entries(priceData.bpi)
console.log(bpiArr[0][1].description)

注意:bpiArr[0] 的第一个 [0] 元素包含字符串“USD”,第二个 [1] 包含一个获取描述键及其值的对象。

More information

【讨论】:

  • 感谢这是很棒的帮助
  • 抱歉没有意识到它按时间顺序从上到下排序:-) - 现已修复
【解决方案2】:

bpi 不是一个数组而是一个对象。如果它使用大括号,它就是一个对象。如果使用方括号,它是一个数组。要访问 bpi 对象的 USD 属性,请使用点表示法(就像您所做的那样:bpi.USD)或使用 bpi["USD"]

【讨论】:

  • 谢谢 - 以及关于大括号和方括号的额外上下文
【解决方案3】:

基于您的 JSON bpi 是一个对象,但您通过数组索引访问它是错误的。如果您想要美元的价值,那么您在第一个 sn-p 中访问的方式是正确的。但是,如果您想将其用作数组,则可以执行以下操作:

const {bpi= {}} = json;
const bpiArr = Object.entries(bpi);

// to access all the values
for (const [key,val] of bpiArr) {
   console.log(key,val.description)
}

【讨论】:

  • 感谢这对我很有帮助
猜你喜欢
  • 2016-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-29
  • 1970-01-01
  • 1970-01-01
  • 2014-10-17
  • 1970-01-01
相关资源
最近更新 更多