【问题标题】:How to access the object inside a nested array from a JSON?如何从 JSON 访问嵌套数组中的对象?
【发布时间】:2017-11-27 18:03:34
【问题描述】:

我正在尝试从 listitem 数组中获取名称并将它们打印/存储在变量中

这是结构:

{
 "items": [
  {
   "pagemap": {    
    "listitem": [
     {
      "name": "Transformers: The Last Knight"
     },
     {
      "name": "Transformers: The Last Knight"
     },
     {
      "name": "Transformers: The Last Knight"
     },
     {
      "name": "Despicable Me 3"
     },
     {
      "name": "Slumber Party"
     },
     {
      "name": "Everything, Everything"
     },
     {
      "name": "Can We Still Be Friends?"
     },
     {
      "name": "Transformers: The Last Knight"
     },
     {
      "name": "Wonder Woman"
     },
     {
      "name": "Transformers: The Last Knight"
     }
    ]
   }
  }

我还是 node.js 的新手,这就是我从 JSON 中提取它的方式

let{      
    items:[{
      pagemap: {
        listitem: [{              
        name                     
          }]
        }
    }]
} = showList;

如何获取 listitem 中的所有名称并将它们存储在一个变量中以便我可以打印它们?

【问题讨论】:

    标签: arrays json node.js multidimensional-array


    【解决方案1】:
    let listItem = [];
    showList.forEach((item) => {
        if(item && item.pagemap && item.pagemap.listitem){
           item.pagemap.listitem.forEach((lItem) => {
               if(lItem && lItem.name){
                  listItem.push(lItem.name)
               }
           })
        }
    })
    

    【讨论】:

    • 考虑为您的代码添加解释以帮助用户理解。
    • 感谢您的回复,显然,当我 console.log listItem 数组知道它有效时,它没有显示日志,我猜它没有,还有其他选择吗?跨度>
    【解决方案2】:

    const results = {
     "items": [{
      "pagemap": {
       "listitem": [
        { "name": "Transformers: The Last Knight" },
        { "name": "Transformers: The Last Knight" },
        { "name": "Transformers: The Last Knight" },
        { "name": "Despicable Me 3" },
        { "name": "Slumber Party" },
        { "name": "Everything, Everything" },
        { "name": "Can We Still Be Friends?" },
        { "name": "Transformers: The Last Knight" },
        { "name": "Wonder Woman" },
        { "name": "Transformers: The Last Knight" }
       ]
      }
     }]
    };
    
    function nameOnly(listItem) {
        return listItem.name;
    }
    function resultItemsReducer(memo, item) {
        return memo.concat(item.pagemap.listitem.map(nameOnly));
    }
    const names = results.items.reduce(resultItemsReducer, []);
    console.log(names);

    Array.reduce() 和 on MDN 以及 Array.map() 都有很好的记录。

    每个功能几乎都一目了然,但如果您需要更多详细信息,请告诉我。

    【讨论】:

    • 感谢您的回复,遗憾的是它仍然没有记录,这可能是什么问题? pagemap 是 items 的一个对象,里面大概有 10 个 pagemap,但我只想要上面发布的第一个 pagemap,我仍然找不到访问其中名称的方法
    • 我不确定您在寻找什么。我编辑了我的回复以包含您的对象,因此您只需单击Run this code。如果这仍然不是您所期望的,请告诉我。如果是,请提供预期的输出。
    【解决方案3】:

    您可能需要考虑使用 jsonpath。这些库有一个基于路径查询 JSON 的工具。安装使用指南here.

    关于您的问题,通过使用 jsonpath,您只能访问 JSON 对象中的“名称”属性,如下所示

    var jsonpath = require('jsonpath');
    var data = {
     "items": [{
      "pagemap": {
       "listitem": [
        { "name": "Transformers: The Last Knight" },
        { "name": "Transformers: The Last Knight" },
        { "name": "Transformers: The Last Knight" },
        { "name": "Despicable Me 3" },
        { "name": "Slumber Party" },
        { "name": "Everything, Everything" },
        { "name": "Can We Still Be Friends?" },
        { "name": "Transformers: The Last Knight" },
        { "name": "Wonder Woman" },
        { "name": "Transformers: The Last Knight" }
       ]
      }
     }]
    };
    
    // query only name from all listitem
    var allnames = jsonpath.query(data, "$.items[0].pagemap.listitem[*].name")
    console.log(allnames)
    
    /* console.log on allnames returns - 
    [ 'Transformers: The Last Knight',
      'Transformers: The Last Knight',
      'Transformers: The Last Knight',
      'Despicable Me 3',
      'Slumber Party',
      'Everything, Everything',
      'Can We Still Be Friends?',
      'Transformers: The Last Knight',
      'Wonder Woman',
      'Transformers: The Last Knight' ]
    */
    

    【讨论】:

      猜你喜欢
      • 2018-08-28
      • 2015-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-26
      • 2018-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多