【问题标题】:Create a new JSON array from nested key/values of existing JSON array从现有 JSON 数组的嵌套键/值创建一个新的 JSON 数组
【发布时间】:2018-08-12 23:31:01
【问题描述】:

我有一个对象数组,它们的结构总是如下:

var initialJSON = [  
  {  
     "id":"01",
     "name":"Jane",
     "project":{  
        "title":"Alpha",
        "description":"Lorem ipsum dolor sit amet, consectetur adipiscing elit",
        "city":"New York"
     },
     "dateCreated":"2018-04-28 04:11:16 UTC"
   },
   {  
     "id":"02",
     "name":"Sarah",
     "project":{  
       "title":"Beta",
       "description":"Lorem ipsum dolor sit amet, consectetur adipiscing elit",
       "city":"London"
     },
      "dateCreated":"2018-04-28 04:11:29 UTC"
    },
    {  
      "id":"03",
      "name":"Mia",
      "project":{  
         "title":"Gamma",
         "description":"Lorem ipsum dolor sit amet, consectetur adipiscing elit",
         "city":"Paris"
      },
      "dateCreated":"2018-04-28 04:11:29 UTC"
   }
];

我的目标是创建一个新的对象数组,其中仅包含每个项目项目的键/值。基本上从每个项目中删除所有其他数据(包括父键“项目”)。

最终结果如下所示:

var formattedJSON = [
  {
    "title":"Alpha",
    "description":"Lorem ipsum dolor sit amet, consectetur adipiscing elit",
    "city":"New York"
  },
  {
    "title":"Beta",
    "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit",
    "city":"London"
  },
  {
    "title":"Gamma",
    "description":"Lorem ipsum dolor sit amet, consectetur adipiscing elit",
    "Paris"
  }
]

我很难找到循环遍历数据并获得正确结果的方法。我知道已经发布了类似的问题,但似乎没有从内部键的嵌套键/值中创建一个新数组。

【问题讨论】:

    标签: javascript arrays ecmascript-5


    【解决方案1】:

    您可以为此使用Array#map(),将数组的每个元素分配给它的project 属性:

    let initialJSON=[{"id":"01","name":"Jane","project":{"title":"Alpha","description":"Lorem ipsum dolor sit amet, consectetur adipiscing elit","city":"New York"},"dateCreated":"2018-04-28 04:11:16 UTC"},{"id":"02","name":"Sarah","project":{"title":"Beta","description":"Lorem ipsum dolor sit amet, consectetur adipiscing elit","city":"London"},"dateCreated":"2018-04-28 04:11:29 UTC"},{"id":"03","name":"Mia","project":{"title":"Gamma","description":"Lorem ipsum dolor sit amet, consectetur adipiscing elit","city":"Paris"},"dateCreated":"2018-04-28 04:11:29 UTC"}];
    
    let result = initialJSON.map(element => element.project);
    
    console.log(result)

    【讨论】:

      【解决方案2】:

      您可以使用initialJSON 数组上的map 函数来实现此目的,方法如下:

      var formattedJSON = initialJSON.map(item => {
      
        // For each item in the "initialJSON", map the fields to each item 
        // in the "formattedJSON" array
        return {
          title : item.project.title,
          description : item.project.description,
          city : item.project.city
        }
      
      })
      

      【讨论】:

      • 这让事情变得更加复杂,item.project 已经是一个对象,你可以返回
      【解决方案3】:

      JSON.parse reviver parameter 可用于更改或排除值:

      var j = '[{"id":"01","name":"Jane","project":{"title":"Alpha","description":"Lorem ipsum dolor sit amet, consectetur adipiscing elit","city":"New York"},"dateCreated":"2018-04-28 04:11:16 UTC"},{"id":"02","name":"Sarah","project":{"title":"Beta","description":"Lorem ipsum dolor sit amet, consectetur adipiscing elit","city":"London"},"dateCreated":"2018-04-28 04:11:29 UTC"},{"id":"03","name":"Mia","project":{"title":"Gamma","description":"Lorem ipsum dolor sit amet, consectetur adipiscing elit","city":"Paris"},"dateCreated":"2018-04-28 04:11:29 UTC"}]'
      
      let result = JSON.parse(j, (k, v) => v.project || v);
      
      console.log( result )

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多