Итерировать внутренние объекты с помощью lodash - PullRequest
0 голосов
/ 01 августа 2020

Вот мой 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"
    }]
}

Я пробовал использовать Loda sh s partialRight, но, похоже, он не работает с повторяемыми объектами, а также пробовал flatMap, но не работал. Было бы здорово, если бы мне кто-нибудь помог решить эту проблему. Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 01 августа 2020

вы можете использовать vanilla javascript вместо Loda sh, чтобы сделать это. Ищите методы ES6, такие как map / reduce / filter. Пример:

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
    })),
} 
0 голосов
/ 01 августа 2020

Вы можете использовать toArray и mapValues, как показано ниже:

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);

...