Javascript 对象数组的Lodash并集

Javascript 对象数组的Lodash并集,javascript,lodash,Javascript,Lodash,我想使用\uuu.union函数创建两个对象数组的并集。Union仅在使用===检查两个值是否相等时才使用基元数组 我想比较使用键属性的对象:具有相同键属性的对象将被视为相等。理想情况下,使用lodash是否有一种很好的功能性方法来实现这一点?这是一种非纯lodash方法,但使用array.concat函数,您可以非常简单地使用uniq(): 另一种方法是使用和: 那之前用两个数组的concat呢 从“lodash”导入 常数arrayUnion=(arr1,arr2,标识符)=>{ 常量数组=

我想使用
\uuu.union
函数创建两个对象数组的并集。Union仅在使用===检查两个值是否相等时才使用基元数组


我想比较使用键属性的对象:具有相同键属性的对象将被视为相等。理想情况下,使用lodash是否有一种很好的功能性方法来实现这一点?

这是一种非纯lodash方法,但使用array.concat函数,您可以非常简单地使用
uniq()

另一种方法是使用和:

那之前用两个数组的concat呢

从“lodash”导入 常数arrayUnion=(arr1,arr2,标识符)=>{ 常量数组=[…arr1,…arr2] 返回uqby(数组,标识符) } 常量数组1=[{id:1},{id:2},{id:3}] 常量数组2=[{id:3},{id:4},{id:4}] log(arrayUnion(array1,array2,'id')) 结果→ [{'id':1},{'id':2},{'id':3},{'id':4}]


\uu.unionBy(array1、array2、matcherFn)

从数组中删除合并对象

const test1=[
{姓名:'zhanghong',年龄:32岁,货币:0,尺码:12,},
{姓名:'wanghong',年龄:20岁,尺码:6},
{姓名:'金红',年龄:16岁,身高:172},
]
常数test2=[
{姓名:张红,性别:男,年龄:14},
{姓名:'wanghong',性别:'female',年龄:33},
{姓名:'lihong',性别:'female',年龄:33},
]
常数test3=[
{name:'meinv'},
]
常数test4=[
{name:'aaa'},
]
常数test5=[
{姓名:'zhanghong',年龄:'wtf'},
]
const result=mergeUnionByKey(test1、test2、test3、test4、[]、test5、‘name’、‘override’)
函数mergeUnionByKey(…args){
常量配置=389;.chain(args)
.filter(u.isString)
.value()
常量键=551;.get(配置“[0]”)
const strategy=\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
如果(!\ isString(键))
抛出新错误('缺少密钥')
常量数据集=389;.chain(args)
.reject(u.isEmpty)
.filter(u.isArray)
.value()
const datasetsIndex=\.mapValues(数据集,数据集=>\.keyBy(数据集,键))
const uniqKeys=qkeys.chain(数据集)
.flatte()
.地图(图例)
.uniq()
.value()
返回链(单键)
.map(val=>{
常量数据={}
_.each(数据集索引,数据集=>策略(数据,数据集[val]))
返回数据
})
.过滤器(键)
.value()
}
console.log(JSON.stringify(result,null,4))

晚会迟到了,但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,'propname')

  • 使用“所有关键点”属性比较对象:-
  • _.unionWith(array1,array2,u.isEqual)

  • 使用字符串键属性以不区分大小写的方式比较对象:-
  • _.unionWith(array1,array2,函数(obj,other){返回obj.propname.toLowercase()==other.propname.toLowercase();})


    propname是对象的关键属性的名称。

    什么是matcherFn或matcher?matcherFn/matcher只是我说你编写的函数来确定对象是否唯一谢谢:)你节省了我不少时间。我真的不想写这个函数,lolI在这里看不到两个数组正在合并。@SirajAlam合并在这里完成:const array=[…arr1,…arr2]
    var union = _.uniq(_.flatten([array1, array2]), matcherFn);
    
    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 }]