Объедините два массива и сгладьте один из внутренних объектов - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь объединить два массива (на основе идентификатора) и сгладить один из объектов. Я посмотрел и не нашел ничего похожего.

Вот что я пытаюсь сделать и чего добился:

const a = {
    someProperty: 'something',
    anotherProperty: 'somethingelse',
    listOfUsers: [
        { id: 100, a1: 'somea1', a2: 'somea2'},
        { id: 101, a1: 'somea1', a2: 'somea2'},
        { id: 102, a1: 'somea1', a2: 'somea2'},
        { id: 103, a1: 'somea1', a2: 'somea2'}
    ]

}
const b = [
    { id: 100, b1: { b2: 'someB2', b3: 'someB3'}},
    { id: 101, b1: { }}, //can be empty,
    { id: 102, b1: { b2: undefined, b3: 'someB3'}}, //b2 can be undefined
    { id: 103, b1: { b2: 'someB2', b3: 'someB3'}}
]

const aAndB = a.listOfUsers.map(item => ({
    ...item,
    b_role: { ...b.find((itemInner) => itemInner.id === item.id) }
}));

Это дает мне:

{
    id: 100, a1: 'somea1', a2: 'somea2',
    b_role: {b2: 'someB2', b3: 'someB3'}
}
// if nothing is found:
{
    id: 100, a1: 'somea1', a2: 'somea2',
    b_role: {}
}

Но я хочу:

{
    id: 100, a1: 'somea1', a2: 'somea2',
    b_role: 'someB2' // I want b.b2 but b can be empty
}
// if nothing is found:
{
    id: 100, a1: 'somea1', a2: 'somea2',
    b_role: undefined
}

Как мне это сделать? Я могу использовать подчеркивание, если это помогает

Ответы [ 2 ]

0 голосов
/ 03 августа 2020

это мой код, возможно вы сможете протестировать с другим значением

const a = {
  someProperty: 'something',
  anotherProperty: 'somethingelse',
  listOfUsers: [
    { id: 100, a1: 'somea1', a2: 'somea2'},
    { id: 101, a1: 'somea1', a2: 'somea2'},
    { id: 102, a1: 'somea1', a2: 'somea2'},
    { id: 103, a1: 'somea1', a2: 'somea2'}
  ]
};

const b = [
  { id: 100, b1: { b2: 'someB2', b3: 'someB3'}},
  { id: 101, b1: { }}, //can be empty,
  { id: 102, b1: { b2: undefined, b3: 'someB3'}}, //b2 can be undefined
  { id: 103, b1: { b2: 'someB2', b3: 'someB3'}}
]

const aAndB = a.listOfUsers.map(item => ({
  ...item,
  b_role: b.find((itemInner) => itemInner.id === item.id).b1.b2
}));

console.log(aAndB);

[
  { id: 100, a1: 'somea1', a2: 'somea2', b_role: 'someB2' },
  { id: 101, a1: 'somea1', a2: 'somea2', b_role: undefined },
  { id: 102, a1: 'somea1', a2: 'somea2', b_role: undefined },
  { id: 103, a1: 'somea1', a2: 'somea2', b_role: 'someB2' }
]
0 голосов
/ 03 августа 2020

Ciao, вот рабочий пример:

const a = {
    someProperty: 'something',
    anotherProperty: 'somethingelse',
    listOfUsers: [
        { id: 100, a1: 'somea1', a2: 'somea2'},
        { id: 101, a1: 'somea1', a2: 'somea2'},
        { id: 102, a1: 'somea1', a2: 'somea2'},
        { id: 103, a1: 'somea1', a2: 'somea2'}
    ]
}
const b = [
    { id: 100, b1: { b2: 'someB2', b3: 'someB3'}},
    { id: 101, b1: {} }, //can be empty,
    { id: 102, b1: { b2: undefined, b3: 'someB3'}}, //b2 can be undefined
    { id: 103, b1: { b2: 'someB2', b3: 'someB3'}}
]

let arr_result = [];
a.listOfUsers.map(a_el => {
   b.map(b_el => {
      if (b_el.id === a_el.id) {
         let result = {};
         result.id = a_el.id;
         result.a1 = a_el.a1;
         result.a2 = a_el.a2;
         result.b_role = b_el.b1.hasOwnProperty('b2') ? b_el.b1.b2 : undefined;
         arr_result.push(result);
      }
   })
})

console.log(arr_result)
...