Как совместить отношения на нормализованном JSON с Lodash? - PullRequest
0 голосов
/ 04 октября 2019

Итак, у меня есть два массива объектов, один с людьми, а другой с такими заданиями:

[
  {
    id: 1,
    name: 'Daniel',
    job: 146
  },
  {
    id: 2,
    name: 'Jose',
    job: 163
  }
]

и:

[
  {
    id: 146,
    name: 'Developer'
  },
  {
    id: 163,
    name: 'DevOps'
  }
]

Я хочу получить одинмассив людей, где идентификатор задания заменяется на весь объект задания, например:

[
  {
    id: 1,
    name: 'Daniel',
    job: {
      id: 146,
      name: 'Developer'
    },
  },
  {
    id: 2,
    name: 'Jose',
    job: {
      id: 163,
      name: 'DevOps'
    }
  }
]

Возможно, lodash - не лучший подход, но у меня нет другой идеи. Помогите, если можете, и спасибо.

Ответы [ 2 ]

2 голосов
/ 04 октября 2019

Вы можете создать справочную таблицу (т. Е. Объект) из вашего массива заданий, используя .reduce(), где идентификатор задания становится ключом, а само задание становится значением. Затем вы можете .map() свой массив people включить значение job из созданной вами справочной таблицы.

См. Пример ниже:

const people = [{id:1,name:"Daniel",job:146},{id:2,name:"Jose",job:163}];
const jobs = [{id:146,name:"Developer"},{id:163,name:"DevOps"}];

const lut = jobs.reduce((acc, job) => (acc[job.id] = job, acc), {});
const result = people.map(({job, ...person}) => ({...person, job: lut[job]}));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 04 октября 2019

Использование Array.map и Array.find

var persons=[
  {
    id: 1,
    name: 'Daniel',
    job: 146
  },
  {
    id: 2,
    name: 'Jose',
    job: 163
  }
];

var jobs=[
  {
    id: 146,
    name: 'Developer'
  },
  {
    id: 163,
    name: 'DevOps'
  }
];

var retVal=persons.map(p=>{
return {...p,job:jobs.find(j=> j.id==p.job)};
})

console.log(retVal)
...