Lodash union of arrays of objects

前端 未结 6 1715
臣服心动
臣服心动 2020-12-10 02:57

I\'d like to use the _.union function to create a union of two arrays of objects. Union works with arrays of primitives only as it uses === to examine if two va

6条回答
  •  孤城傲影
    2020-12-10 03:47

    lodash merge object from arrays

    const test1 = [
      { name: 'zhanghong', age: 32, money: 0, size: 12, },
      { name: 'wanghong', age: 20, size: 6 },
      { name: 'jinhong', age: 16, height: 172 },
    ]
    
    const test2 = [
      { name: 'zhanghong', gender: 'male', age: 14 },
      { name: 'wanghong', gender: 'female', age: 33 },
      { name: 'lihong', gender: 'female', age: 33 },
    ]
    
    const test3 = [
      { name: 'meinv' },
    ]
    
    const test4 = [
      { name: 'aaa' },
    ]
    
    const test5 = [
      { name: 'zhanghong', age: 'wtf' },
    ]
    
    const result = mergeUnionByKey(test1, test2, test3, test4, [], test5, 'name', 'override')
    
    function mergeUnionByKey(...args) {
    
      const config = _.chain(args)
        .filter(_.isString)
        .value()
    
      const key = _.get(config, '[0]')
    
      const strategy = _.get(config, '[1]') === 'override' ? _.merge : _.defaultsDeep
    
      if (!_.isString(key))
        throw new Error('missing key')
    
      const datasets = _.chain(args)
        .reject(_.isEmpty)
        .filter(_.isArray)
        .value()
    
      const datasetsIndex = _.mapValues(datasets, dataset => _.keyBy(dataset, key))
    
      const uniqKeys = _.chain(datasets)
        .flatten()
        .map(key)
        .uniq()
        .value()
    
      return _.chain(uniqKeys)
        .map(val => {
          const data = {}
          _.each(datasetsIndex, dataset => strategy(data, dataset[val]))
          return data
        })
        .filter(key)
        .value()
    
    }
    
    console.log(JSON.stringify(result, null, 4))

提交回复
热议问题