_.union
関数を使用して、オブジェクトの2つの配列の結合を作成します。 Unionは、2つの値が等しいかどうかを調べるために===を使用する場合にのみ、プリミティブの配列で機能します。
キープロパティを使用してオブジェクトを比較したいと思います。同じキープロパティを持つオブジェクトは等しいと見なされます。 lodashを理想的に使用してそれを達成するための素晴らしい機能的な方法はありますか?
これを行う純粋なlodash方法ですが、array.concat関数を使用すると、uniq()
に沿ってこれをかなり簡単に行うことができます。
var objUnion = function(array1, array2, matcher) {
var concated = array1.concat(array2)
return _.uniq(concated, false, matcher);
}
別のアプローチは、 flatten() および niq() を使用することです:
var union = _.uniq(_.flatten([array1, array2]), matcherFn);
そして、前に2つの配列の連結で niqBy はどうですか?
_.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
result→[{'x':1}、{'x':2}]
パーティーには遅れますが、_。unionWithは、やりたいことを行うのにはるかに優れています。
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 }]
_.unionBy(array1, array2, matcherFn);
配列からのlodashマージオブジェクト
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>
_.unionBy(array1、array2、 'propname');
_.unionWith(array1、array2、_.isEqual);
_.unionWith(array1、array2、function(obj、other){return obj.propname.toLowercase()=== other.propname.toLowercase();});
propnameは、オブジェクトのキープロパティの名前です。