Как я могу объединить этот массив объекта? - PullRequest
0 голосов
/ 23 марта 2020

У меня есть этот массив объектов:

let array1 = [{
      id: 1,
      code: 'wawa'
    },
    {
      id: 2,
      code: 'qwqw'
    }]

    let array2 = [{
      id: 1,
      code: 'ewew'
    },
    {
      id: 3,
      code: 'eee'
    }]

    let array3 = [{
      id: 3,
      code: 'ww'
    },
    {
      id: 1,
      code: 'ww'
    },
    {
      id: 4,
      code: 'q'
    }
  ]

  let arrayGeral = new Array()
  arrayGeral.push(array1)
  arrayGeral.push(array2)
  arrayGeral.push(array3)

Как я могу объединить объекты в arrayGeral в один объект массива?

Я могу делать то, что хочу, используя loda sh, но я не могу придумать итерации и сделать этот автомат c:

let merged = _.merge(_.keyBy(array1, 'id'), _.keyBy(array2, 'id'))
merged = _.merge(_.keyBy(merged, 'id'), _.keyBy(array3, 'id'))

Ответы [ 3 ]

1 голос
/ 23 марта 2020

Я полагаю, что последние значения должны быть сохранены. Если дело обстоит именно так, то вы должны обратить то, что вы делали sh:

let arrayGeral = new Array();
arrayGeral.push(...array3);
arrayGeral.push(...array2);
arrayGeral.push(...array1);

Теперь все, что вам нужно сделать, это использовать функцию _.uniqBy loda sh:

_.uniqBy(arrayGeral, 'id');

let array1 = [
  {
    id: 1,
    code: 'wawa'
  },
  {
    id: 2,
    code: 'qwqw'
  }
];

let array2 = [
  {
    id: 1,
    code: 'ewew'
  },
  {
    id: 3,
    code: 'eee'
  }
];

let array3 = [
  {
    id: 3,
    code: 'ww'
  },
  {
    id: 1,
    code: 'ww'
  },
  {
    id: 4,
    code: 'q'
  }
];

let arrayGeral = new Array();
arrayGeral.push(...array3);
arrayGeral.push(...array2);
arrayGeral.push(...array1);

console.log(_.uniqBy(arrayGeral, 'id'));
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script>
1 голос
/ 23 марта 2020

Если это ваш вывод:

[                                                                   
   { id: 1, code: [ 'wawa', 'ewew', 'ww' ] },                          
   { id: 2, code: [ 'qwqw' ] },                                        
   { id: 3, code: [ 'eee', 'ww' ] },                                   
   { id: 4, code: [ 'q' ] }                                            
]                                                                     

Затем обратитесь к приведенному ниже коду:

let array1 = [{ id: 1, code: 'wawa'}, { id: 2, code: 'qwqw' }]
let array2 = [{ id: 1, code: 'ewew'}, { id: 3, code: 'eee'  }]
let array3 = [{ id: 3, code: 'ww'  }, { id: 1, code: 'ww'   }, 
              { id: 4, code: 'q'   }]

var concated = array1.concat(array2).concat(array3);  //Flaten the concatenated array
let output = concated.reduce((acc, cur) => {     
    let entry = acc.find(item => item.id === cur.id);
    if (entry && Array.isArray(entry.code)) { //Check if it has sth in the array
            entry.code.push(cur.code);
        }
    else  {
      acc.push({id: cur.id, code: [cur.code]}); //For the 1st time, add it to the array
    }
    //console.log(acc);
    return acc;
}, []);
console.log(output);
1 голос
/ 23 марта 2020

Я предполагаю, что вы хотите объединить их в 1 массив без группировки по идентификатору. В этом случае вы можете использовать concat, чтобы объединить их в 1 массив следующим образом: mergedArray = array1.concat(array2, array3)

let array1 = [{
      id: 1,
      code: 'wawa'
    },
    {
      id: 2,
      code: 'qwqw'
    }]

    let array2 = [{
      id: 1,
      code: 'ewew'
    },
    {
      id: 3,
      code: 'eee'
    }]

    let array3 = [{
      id: 3,
      code: 'ww'
    },
    {
      id: 1,
      code: 'ww'
    },
    {
      id: 4,
      code: 'q'
    }
  ]  

var concatArr = array1.concat(array2, array3);
console.log(concatArr);
...