【问题标题】:Self merging an object - lodash自合并对象 - lodash
【发布时间】:2019-12-04 06:06:40
【问题描述】:

我有一个对象:

obj1 = [{
           "accId": 23,
           "sName" : "qw" 
        }, 
        { 
           "accId": 23,
           "sName": "as" 
        },
        {
           "accId":24,
           "sName": "we"
        }
] 

我想使用 lodash 将这个对象列表自我合并到:

result = [{
             "accId": 23,
             "sName" : ["qw","as"]

          },
          {
           "accId":24,
           "sName": ["we"]
          }
]

我尝试使用带有 for 循环的纯 JavaScript,但它似乎非常低效。我还尝试了一些 lodash 函数,但找不到完美的匹配。 我还想到了将对象列表拆分为单独的列表,每个列表一个对象并使用 _.merge() 合并的想法。但是不知道有没有办法拆分对象列表。

【问题讨论】:

    标签: javascript list object lodash


    【解决方案1】:

    Lodash uniqBy 允许您指定一个迭代对象,该迭代对象将传递给数组的每个成员。结果数组对于该迭代的返回值将是唯一的。

    let array = [{
        "accId": 23,
        "sName": "qw"
      },
      {
        "accId": 23,
        "sName": "as"
      },
      {
        "accId": 24,
        "sName": "we"
      }
    ]
    
    let uniqArray = _.uniqBy(array, o => o.accId);
    console.log(uniqArray);
    <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.10/lodash.min.js"></script>

    【讨论】:

    • 谢谢 :) 。但这并没有给出我想要的输出。
    【解决方案2】:

    使用 lodash,您可以使用 _.flow() 生成一个函数,该函数首先将具有相同 accId 的项目分组,然后映射每个组并生成一个新对象,其中收集到该组的 sName 值:

    const { flow, partialRight: pr, groupBy, map, head } = _
    
    const fn = flow(
      pr(groupBy, 'accId'),
      pr(map, vs => ({ ...head(vs), sName: map(vs, 'sName')}))
    )
    
    const array = [{"accId":23,"sName":"qw"},{"accId":23,"sName":"as"},{"accId":24,"sName":"we"}]
    
    const result = fn(array)
    
    console.log(result);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>

    与 Lodash/fp 的想法相同:

    const { flow, groupBy, map, head } = _
    
    const fn = flow(
      groupBy('accId'),
      map(vs => ({ ...head(vs), sName: map('sName', vs)}))
    )
    
    const array = [{"accId":23,"sName":"qw"},{"accId":23,"sName":"as"},{"accId":24,"sName":"we"}]
    
    const result = fn(array)
    
    console.log(result);
    <script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>

    【讨论】:

      【解决方案3】:

      您可以使用像这样的自定义 reduce 函数:

      function merge (data) {
        const values = data.reduce((acum, item) => {
          const key = item.accId
          let cached = acum[key]
      
          if (cached) {
            cached.sName.push(item.sName)
          } else {
            cached = {
              "accId": key,
              "sName": [item.sName]
            }
          }
      
          return { ...acum, [key]: cached }
        }, {})
      
        return Object.values(values)
      }
      

      这个功能会解决你的问题。

      【讨论】:

        猜你喜欢
        • 2016-06-12
        • 2018-08-07
        • 2015-06-03
        • 2018-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-07
        相关资源
        最近更新 更多