【问题标题】:How to map nested object using map ( ES6 )?如何使用 map ( ES6 ) 映射嵌套对象?
【发布时间】:2020-04-13 13:39:28
【问题描述】:

我有一个 javascript 复杂对象。这是对象:这是我从 rest api 获得的内容帖子:

{
    "id": 2598,
    "date": "2018-10-15T06:20:10",
    "date_gmt": "2018-10-15T06:20:10",
    "modified": "2019-05-16T23:35:50",
    "modified_gmt": "2019-05-16T21:35:50",
    "slug": "lorem-ipsum-dolor-sit-amet-consectetur-adipisicing-elit",
    "status": "publish",
    "type": "post",
    "link": "http://www.website.org/2018/10/15/lorem-ipsum-dolor-sit-amet-consectetur-adipisicing-elit/",
    "title": {
        "rendered": "Lorem ipsum dolor sit amet, consectetur adipisicing elit"
    },
    "content": {
        "rendered": "<p>Eaque ipsa quae ab illo inventore veritatis et quasi. Eaque ipsa quae ab illo inventore veritatis et quasi. Et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti </p>\n",
        "protected": false
    },
    "author_meta": {
        "ID": "1",
        "user_nicename": "megmail-com",
        "user_email": "me@gmail.com",
        "user_registered": "2018-12-31 08:16:31",
        "display_name": "me@gmail.com",
        "first_name":"John",
        "last_name": "DOE"
    },
    "_links": {
        "self": [
            {
                "href": "http://www.website.org/wp-json/wp/v2/posts/2598"
            }
        ]
    }
}

我想将此对象转换为另一个包含:

{
    "id": 2598,
    "date": "2018-10-15T06:20:10",
    "slug": "lorem-ipsum-dolor-sit-amet-consectetur-adipisicing-elit",
    "title": {
        "rendered": "Lorem ipsum dolor sit amet, consectetur adipisicing elit"
    },
    "content": {
        "rendered": "<p>Eaque ipsa quae ab illo inventore veritatis et quasi. Eaque ipsa quae ab illo inventore veritatis et quasi. Et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti </p>\n",
        "protected": false
    },
    "authorlastname": "John",
    "authorfirstname": "DOE"
}

如何使用地图?

这是我想做的:

post = post
        .map(({ id, slug, title, date, content, authorlastname,  authorfirstname,
                  }) => ({
          id,
          slug,
          title,
          excerpt,
          date,
          tags,
          content,
          ???, 
          ???
        }))

感谢您的帮助

【问题讨论】:

    标签: javascript json ecmascript-6


    【解决方案1】:

    您也可以解构author_meta 并使用属性重命名。

    获取对象

    const subset = ({
        id,
        slug,
        title,
        date,
        content,
        author_meta: { first_name: authorfirstname, last_name: authorlastname } 
    }) => ({ 
        id,
        slug,
        title,
        excerpt,
        date,
        tags,
        content,
        authorlastname,
        authorfirstname
    });
    
    post = subset(post);
    
    // if you have the objects in an array, you could map the new objects with
    posts = posts(subset);
    

    【讨论】:

    • 你不能在对象上使用.map
    • @andreas,对。请参阅编辑。 op的问题有点误导。
    【解决方案2】:

    我们不能在这里使用.map() 方法,因为它是一个数组方法,而post 是一个对象。所以,我们可以像这样简单地映射它:

    const result = {
      id: post.id,
      slug: post.slug,
      title: post.title,
      date: post.date,
      content: post.content,
      authorlastname: post.author_meta.last_name,
      authorfirstname: post.author_meta.first_name
    }
    

    演示:

    const post = {
      "id": 2598,
      "date": "2018-10-15T06:20:10",
      "date_gmt": "2018-10-15T06:20:10",
      "modified": "2019-05-16T23:35:50",
      "modified_gmt": "2019-05-16T21:35:50",
      "slug": "lorem-ipsum-dolor-sit-amet-consectetur-adipisicing-elit",
      "status": "publish",
      "type": "post",
      "link": "http://www.website.org/2018/10/15/lorem-ipsum-dolor-sit-amet-consectetur-adipisicing-elit/",
      "title": {
        "rendered": "Lorem ipsum dolor sit amet, consectetur adipisicing elit"
      },
      "content": {
        "rendered": "<p>Eaque ipsa quae ab illo inventore veritatis et quasi. Eaque ipsa quae ab illo inventore veritatis et quasi. Et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti </p>\n",
        "protected": false
      },
      "author_meta": {
        "ID": "1",
        "user_nicename": "megmail-com",
        "user_email": "me@gmail.com",
        "user_registered": "2018-12-31 08:16:31",
        "display_name": "me@gmail.com",
        "first_name": "John",
        "last_name": "DOE"
      },
      "_links": {
        "self": [{
          "href": "http://www.website.org/wp-json/wp/v2/posts/2598"
        }]
      }
    }
    
    const result = {
      id: post.id,
      slug: post.slug,
      title: post.title,
      date: post.date,
      content: post.content,
      authorlastname: post.author_meta.last_name,
      authorfirstname: post.author_meta.first_name
    }
    console.log(result)
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      【解决方案3】:

      你不能在对象上使用.map,但你可以直接访问道具。这将为您提供预期的结果:

      const {id, date, slug, title, content} = post
      
      const newPost = {
        id,
        date,
        slug,
        title,
        content,
        authorlastname: post.author_meta.last_name,
        authorfirstname: post.author_meta.first_name
      }
      

      【讨论】:

        【解决方案4】:

        你可以改成

        var obj =(({ id, slug, title, date }) => ({id, slug, title, date }))(post);
        

        var post = {
            "id": 2598,
            "date": "2018-10-15T06:20:10",
            "date_gmt": "2018-10-15T06:20:10",
            "modified": "2019-05-16T23:35:50",
            "modified_gmt": "2019-05-16T21:35:50",
            "slug": "lorem-ipsum-dolor-sit-amet-consectetur-adipisicing-elit",
            "status": "publish",
            "type": "post",
            "link": "http://www.website.org/2018/10/15/lorem-ipsum-dolor-sit-amet-consectetur-adipisicing-elit/",
            "title": {
                "rendered": "Lorem ipsum dolor sit amet, consectetur adipisicing elit"
            },
            "content": {
                "rendered": "<p>Eaque ipsa quae ab illo inventore veritatis et quasi. Eaque ipsa quae ab illo inventore veritatis et quasi. Et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti </p>\n",
                "protected": false
            },
            "author_meta": {
                "ID": "1",
                "user_nicename": "megmail-com",
                "user_email": "me@gmail.com",
                "user_registered": "2018-12-31 08:16:31",
                "display_name": "me@gmail.com",
                "first_name":"John",
                "last_name": "DOE"
            },
            "_links": {
                "self": [
                    {
                        "href": "http://www.website.org/wp-json/wp/v2/posts/2598"
                    }
                ]
            }
        };
        
        var obj =(({ id, slug, title, date
                          }) => ({       id,          slug,          title,                    date,          }))(post);
                
                console.log(obj)

        【讨论】:

          猜你喜欢
          • 2018-09-29
          • 1970-01-01
          • 1970-01-01
          • 2014-12-30
          • 2016-10-14
          • 1970-01-01
          • 1970-01-01
          • 2020-09-27
          • 2013-08-01
          相关资源
          最近更新 更多