0%

lodash合并对象数组

因pmo查询做得辣鸡,需要多次查询合成结果集,查询经常遇到对象数组合并问题(key不存在也要赋值)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const test1 = [
{ name: 'zhanghong', age: 32, },
{ name: 'wanghong', age: 20, size: 6 },
]

const test2 = [
{ name: 'zhanghong', gender: 'male'},
{ name: 'wanghong', gender: 'female'},
]

期望最后结果集合
const test3 = [
{ name: 'zhanghong',gender: 'male', age: 32, size: 6, },
{ name: 'wanghong', gender: 'female' ,age: 20, size: 0 },
]

参照

https://stackoverflow.com/questions/29320817/lodash-union-of-arrays-of-objects

暂时解决,待优化代码

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))