Combining Lodash Arrays of Objects

I would like to use the _.union function to create a union of two arrays of objects. Union only works with arrays of primitives if it uses === to check if two values ​​are equal.

I would like to compare objects using the key property: objects with the same key property will be considered equal. Is there a good functional way to achieve this, ideally using lodash?

+13
javascript lodash
source share
5 answers

Not a clean lodash way to do this, but using the array.concat function, you can do this quite simply by uniq() :

 var objUnion = function(array1, array2, matcher) { var concated = array1.concat(array2) return _.uniq(concated, false, matcher); } 

An alternative approach would be to use flatten () and uniq () :

 var union = _.uniq(_.flatten([array1, array2]), matcherFn); 
+14
source share

What about UniqBy with concatenations from two arrays earlier?

 _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x'); 

result β†’ [{'x': 1}, {'x': 2}]

+11
source share

Late to the party, but _.unionWith it’s much better to do what you want.

 var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; _.unionWith(objects, others, _.isEqual); // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }] 
+9
source share

_.unionBy(array1, array2, matcherFn);

+2
source share

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)) 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script> 
+1
source share

All Articles