【问题标题】:How to access a nested object property in JSON [duplicate]如何访问 JSON 中的嵌套对象属性 [重复]
【发布时间】:2020-08-09 16:28:37
【问题描述】:

我正在尝试以 JSON 的以下顺序访问嵌套属性 productTitle,但是,我只能设法使用

JSON.stringify(orders[i].cart.items, null, 4);

我尝试了嵌套循环,但无济于事。我也试过了

JSON.stringify(orders[i].cart.items.item, null, 4);

这也不起作用。缺少一些基本的东西,我花了几个小时浏览 JSON 文档和教程,但找不到具体的帮助。

[
  {
    "_id": "5ea5115224bf1f569c4fac96",
    "user": "5ea19f4160539d264ca1e7c5",
    "cart": {
      "items": {
        "5e92b488fc3e326b70be262d": {
          "item": {
            "_id": "5e92b488fc3e326b70be262d",
            "productCode": "PROD002",
            "productType": "Duvet",
            "productTitle": "Kingsize Duvet",
            "__v": 0
          },
          "qty": 1,
          "price": 3
        },
        "5e92f5f9213dc863e0e97682": {
          "item": {
            "_id": "5e92f5f9213dc863e0e97682",
            "productCode": "PROD006",
            "productType": "Duvet",
            "productTitle": "double-Duvet",
            "__v": 0
          },
          "qty": 2,
          "price": 5
        }
      },
      "totalQty": 3,
      "totalPrice": 8
    },
    "address": "London",
    "name": "John Cena",
    "paymentId": "ch_1Gc2KUIyQsnk8nhOTUR602KW",
    "__v": 0
  }
]

请温柔,我是新手!

更新: 使用以下迭代设法获取嵌套的键和值: for(var i=0;i

        for (var key of Object.keys(orders[i].cart.items)) {


      console.log("Title: "+ orders[i].cart.items[key].item.productTitle );
      console.log("Quanitity: "+  orders[i].cart.items[key].qty);
      console.log(" Price:  "+orders[i].cart.items[key].item.productPrice );
      console.log(" Subtotal: "+orders[i].cart.items[key].item.productPrice * orders[i].cart.items[key].qty);


      console.log("Total Quantity is :"+orders[i].cart.totalQty+" & Total Price: £ " + orders[i].cart.totalPrice);


      }

【问题讨论】:

  • 不应该items 是item 对象的数组吗?在您的 JSON 中,items 是一个带有嵌套对象的对象。嵌套对象似乎是 id 并且还有另一个 _id 包含相同的值。我认为您打算做的是一个 items 数组,其中包含包含所有内容的对象。看看那个。
  • 另外,这里有两个右括号:JSON.stringify(orders[i].cart.items, null, 4)); 也许,您从代码中照原样复制了它,并在另一个函数调用中使用了它。
  • @Azeem 谢谢,是的,额外的括号来自控制台日志。对于两次相同的 ID,我需要有一个与购物车关联的 ID(它可以包含多个产品,每个产品可以添加多次),因此它需要 ID 在购物车内。
  • 您确定它是有效的 JSON 并且 i 是有效的索引吗?
  • 好吧,IMO,它应该是一个数组,因为它是item 对象的集合。它将简化 JSON 本身以及遍历和批量处理。否则,您必须提取 ID 以引用每个 item 对象,然后进行处理/遍历。

标签: javascript json nested-object


【解决方案1】:

我认为您在项目后的呼叫点引用呼叫中错过了获取 5e92b488fc3e326b70be262d。

orders[i].cart.items['5e92f5f9213dc863e0e97682'].item.productTitle

这对我有用。

5e92b488fc3e326b70be262d 也是 json 中的一个对象,因此您必须在访问 item 之前访问 5e92b488fc3e326b70be262d 对象。

'5e92f5f9213dc863e0e97682'已作为地图而不是对象添加到您的 json 中。这就是为什么不使用点运算符的原因。

这就是我所做的。

this.http.get("assets/client.json").subscribe(data =>{
      console.log(data[0].cart.items['5e92f5f9213dc863e0e97682'].item.productTitle);
      var items = data[0].cart.items;
      console.log(items['5e92f5f9213dc863e0e97682'].item.productTitle);
    })

两个控制台语句都将 double-Duvet 作为输出。

【讨论】:

  • 也试过了,但没有运气,因为它给出了一个语法错误,可能是由于数字引用。
  • 现在试试这个。它也适合你。
  • “作为地图而不是作为对象” 毫无意义。您之前使用 . 的示例不起作用的原因是,以数字开头的属性语法无效。更大的问题是 OP 不知道这些属性名称是什么,也无法硬核它们。
  • 这里的 items 是一个列表,其中数据作为键值对作为 map 。您必须在此处提供与我们为 arr[i] 之类的数组提供相同的键来获取值,但是由于数据在键值对中,因此简单的索引位置明智地获取将不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
  • 1970-01-01
  • 2016-07-13
  • 2019-09-15
  • 2012-11-12
相关资源
最近更新 更多