1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| 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))
|