【问题标题】:Iterate inner objects using lodash使用 lodash 迭代内部对象
【发布时间】:2020-08-01 12:27:54
【问题描述】:

这是我的 JSON 对象:

{
"id": 2,
"full_name": "Karan Kumar",
"user_skills": [
   {
      "skill_id": 1,
      "skill": {
          "skill_name": "Angular 8"
       }
   },
   {
      "skill_id": 3,
      "skill": {
          "skill_name": "Java Spring"
       }
    }
],
"resource_allocateds": [
  {
     "project_id": 1,
     "end_date": "2019-06-20",
     "project": {
         "project_name": "Inventory System"
      }
  },
  {
      "project_id": 2,
      "end_date": "2020-01-15",
      "project": {
           "project_name": "Hospital Management System"
       }
    }
  ]
}

我想从上面的 JSON 中选择某些属性,并且我希望它是这样的:

{
    "id": 1,
    "full_name": "Karan Kumar",
    "skills": [{
        "skill_id": 1,
        "skill_name": "Angular 8"
    },
    {
        "skill_id": 3,
       "skill_name": "Java Spring"
    }],
    "resource_allocateds": [{
        "project_id": 1,
        "end_date": "2019-06-20",
        "project_name": "Inventory System"
    },
    {
        "project_id": 2,
        "end_date": "2020-01-15",
        "project_name": "Hospital Management System"
    }]
}

我尝试使用 Lodash 的 partialRight,但它似乎不适用于可迭代对象,也尝试了 flatMap,但没有奏效。如果有人帮助我解决这个问题,那就太好了。提前致谢!

【问题讨论】:

    标签: javascript ecmascript-6 lodash


    【解决方案1】:

    你可以使用 vanilla javascript 而不是 Lodash 来做到这一点。寻找像 map/reduce/filter 这样的 ES6 方法。示例:

    const input = {
    "id": 2,
    "full_name": "Karan Kumar",
    "user_skills": [
       {
          "skill_id": 1,
          "skill": {
              "skill_name": "Angular 8"
           }
       },
       {
          "skill_id": 3,
          "skill": {
              "skill_name": "Java Spring"
           }
        }
    ],
    "resource_allocateds": [
      {
         "project_id": 1,
         "end_date": "2019-06-20",
         "project": {
             "project_name": "Inventory System"
          }
      },
      {
          "project_id": 2,
          "end_date": "2020-01-15",
          "project": {
               "project_name": "Hospital Management System"
           }
        }
      ]
    };
    
    const { id, full_name, user_skills, resource_allocateds } = input;
    
    const output = {
      id,
      full_name,
      skills: user_skills.map(item => ({
          skill_id: item.skill_id,
          skill_name: item.skill.skill_name
        })),
      resource_allocateds: resource_allocateds.map(item => ({
          project_id: item.project_id,
          end_date: item.end_date,
          project_name: item.project.project_name
        })),
    } 
    

    【讨论】:

      【解决方案2】:

      您可以使用toArraymapValues,如下所示:

      const jsonData = {
        "id": 2,
        "full_name": "Karan Kumar",
        "user_skills": [
           {
              "skill_id": 1,
              "skill": {
                  "skill_name": "Angular 8"
               }
           },
           {
              "skill_id": 3,
              "skill": {
                  "skill_name": "Java Spring"
               }
            }
        ],
        "resource_allocateds": [
          {
             "project_id": 1,
             "end_date": "2019-06-20",
             "project": {
                 "project_name": "Inventory System"
              }
          },
          {
              "project_id": 2,
              "end_date": "2020-01-15",
              "project": {
                   "project_name": "Hospital Management System"
               }
          }
        ]
      };
      
      const transformedJson = {...jsonData};
      transformedJson.user_skills = _.toArray(_.mapValues(transformedJson.user_skills, ({ skill_id, skill }) => {
        return {
          skill_id,
          skill_name: skill.skill_name
        };
      }));
      transformedJson.resource_allocateds = _.toArray(_.mapValues(transformedJson.resource_allocateds, ({ project_id, project }) => {
        return {
          project_id,
          project_name: project.project_name
        };
      }));
      
      document.getElementById('jsonResults').innerHTML = JSON.stringify(transformedJson, null, 2);
      <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.19/lodash.min.js"></script>
      <pre id="jsonResults"></pre>

      【讨论】:

        猜你喜欢
        • 2017-08-10
        • 1970-01-01
        • 2011-07-22
        • 1970-01-01
        • 1970-01-01
        • 2021-07-14
        • 1970-01-01
        • 2012-06-18
        • 2016-11-24
        相关资源
        最近更新 更多