【问题标题】:How to insert object into array by id using Javascript如何使用Javascript通过ID将对象插入数组
【发布时间】:2019-10-01 10:14:08
【问题描述】:

我有一个数组和一个对象,它们具有与数组元素不同的属性,但它们通过它们的共同标识符链接在一起。该数组具有以下结构:

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

我的对象具有以下结构:

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

我想通过给定的 ID 将对象附加到数组中,所以最后数组看起来像这样:

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

由于 id 的标识符不同,我很难将它们合并。我曾尝试使用以下代码通过 lodash 进行合并,但没有任何运气。谢谢!

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

【问题讨论】:

    标签: arrays object merge lodash


    【解决方案1】:

    在合并之前将对象 '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>

    【讨论】:

      【解决方案2】:

      请原谅我的提问,但您为什么要以这种特定方式进行此操作?在我看来,它相当昂贵。也可以用一张地图完成并合并:

      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/omitchain/concat/groupBy/map/spread/merge/value

      这也可以很容易地转换为 ES6 并完全跳过 lodash

      除非我误解了这一点,如果是这样,我深表歉意。

      【讨论】:

      • 感谢您的回复,没有特别的理由这样做,您的解决方案确实更有效。最后,我决定将您的解决方案转换为 ES6,这给了我最快的执行速度! :)
      猜你喜欢
      • 2017-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-28
      • 1970-01-01
      • 2022-11-10
      相关资源
      最近更新 更多