Как вставить объект в массив по идентификатору с помощью Javascript - PullRequest
0 голосов
/ 14 мая 2019

У меня есть массив и объект, свойства которого отличаются от элементов массива, но они связаны друг с другом общим идентификатором. Массив имеет следующую структуру:

[{
userId: '12',
prop1: 'blue',
prop2: 'yellow'
},
{
userId: '13',
prop1: 'black',
prop2: 'white'
}]

Мой объект имеет следующую структуру:

{id: '13',
prop3: 'heavy',
prop4: 'light'}

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

[{
userId: '12',
prop1: 'blue',
prop2: 'yellow'
},
{
userId: '13',
prop1: 'black',
prop2: 'white',
prop3: 'heavy',
prop4: 'light'
}]

Поскольку идентификатор для идентификатора не совпадает, мне трудно их объединить. Я попытался слить через lodash, используя следующий код, но мне не повезло. Спасибо!

let merged = _(myArray)
          .concat(myObject)
          .groupBy('id')
          .map(_.spread(_.merge))
          .value();

Ответы [ 2 ]

1 голос
/ 14 мая 2019

Извините за вопрос, но почему вы хотите сделать это именно таким образом? Это кажется мне довольно дорогим. Это также можно сделать с помощью одной карты и объединить:

const arr = [{"userId":"12","prop1":"blue","prop2":"yellow"},{"userId":"13","prop1":"black","prop2":"white"}];1
const obj = {"id":"13","prop3":"heavy","prop4":"light"};

let mergeObjToArr = (o, a) => 
   _.map(a, x => _.isEqual(o.id, x.userId) ? _.merge(_.omit(o, ['id']), x) : x)

console.log(mergeObjToArr(obj, arr))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

Если учесть это, у вас есть map/merge/omit против chain/concat/groupBy/map/spread/merge/value.

Это также может быть легко преобразовано в ES6 и полностью пропустить lodash.

Если только я неправильно понимаю это, за что прошу прощения, если это так.

1 голос
/ 14 мая 2019

Перед объединением измените свойство 'id' на `userId ':

const mergeToArr = (arr, { id: userId, ...rest }) => _(arr)
  .concat({ userId, ...rest })
  .groupBy('userId')
  .map(_.spread(_.merge))
  .value();
          
const arr = [{"userId":"12","prop1":"blue","prop2":"yellow"},{"userId":"13","prop1":"black","prop2":"white"}];1
const obj = {"id":"13","prop3":"heavy","prop4":"light"};

const result = mergeToArr(arr, obj);

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
...