Javascript 组合嵌套数组并删除重复项

Javascript 组合嵌套数组并删除重复项,javascript,arrays,reactjs,nested,lodash,Javascript,Arrays,Reactjs,Nested,Lodash,我将如何组合这些数组集,以便它们连接在一起,并且没有重复的值 我不确定lodash是否对此有所帮助,我找到的大多数其他答案都是基于数组是平面的,但我的数据集结构将它们嵌套起来 谢谢你的帮助 让arr1=[ [“姓名”、“身份证”、“年龄”], [“苏珊”、“3”、“20”], [“约翰”、“1”、“21”], [“鲍勃”、“2”、“23”], [“本”、“4”、“20”] ]; 设arr2=[ [“名称”、“id”、“高度”], [“鲍勃”、“2”、“50”], [“约翰”、“1”、“45”],

我将如何组合这些数组集,以便它们连接在一起,并且没有重复的值

我不确定lodash是否对此有所帮助,我找到的大多数其他答案都是基于数组是平面的,但我的数据集结构将它们嵌套起来

谢谢你的帮助

让arr1=[
[“姓名”、“身份证”、“年龄”],
[“苏珊”、“3”、“20”],
[“约翰”、“1”、“21”],
[“鲍勃”、“2”、“23”],
[“本”、“4”、“20”]
];
设arr2=[
[“名称”、“id”、“高度”],
[“鲍勃”、“2”、“50”],
[“约翰”、“1”、“45”],
[“本”、“4”、“43”],
[“苏珊”、“3”、“48”],
];
设arr3=[
[“名称”、“id”、“父项”],
[“鲍勃”,“2”,“是”],
[“约翰”,“1”,“是”],
];
//期望输出
// [
//[‘姓名’、‘身份证’、‘年龄’、‘身高’、‘父母’],
//[“苏珊”、“3”、“20”、“48”、“18”],
//[“约翰”、“1”、“21”、“45”、“是”],
//[“鲍勃”、“2”、“23”、“50”、“是”],
//[“本”、“4”、“20”、“43”和“
// ]
使用lodash和

展平将阵列合并为展平阵列

uq.uniq(q.flatten([arr1,arr2,arr2));

这就回答了你问题的标题和内容,但从你想要的结果来看,你的处境很艰难。我所概述的不会带来这样的结果


您可以研究使用Lodash的
merge
函数,但是使用对象而不是数组更容易操作。

将行转换为对象,然后使用
Array.reduce()
和映射(保留原始顺序)合并表。保留标题,并使用
。.union()
(或集合)将其组合。然后返回包含组合标题的数组,正文行将使用
数组.mpa()
和组合标题转换为数组

//将表行转换为对象
const tableRowsTobjects=([head,…body])=>[head,body.map(row=>.[uu.zipObject(head,row))]
//合并表格的标题和正文
const combineTables=表=>{
常量头=u0.union(…0.map(表,0.head))
const body=Array.from(
桌子
.flatMap(([行]=>行)
.reduce((acc,row)=>acc.set(row.id,{…acc.get(row.id),…row}),新映射)
.values()
)
返回[标题,正文]
}
//将表转换为对象,合并它们,然后再转换回行
常量合并表=(…表)=>{
const[header,body]=组合表(tables.map(tableRowsToObject))
返回[
标题,
…body.map(行=>header.map(列=>row[col]??“”)
];
}
常数arr1=[“姓名”、“身份证”、“年龄”]、[“苏珊”、“3”、“20”]、[“约翰”、“1”、“21”]、[“鲍勃”、“2”、“23”]、[“本”、“4”、“20”];
常数arr2=[“姓名”、“身份证”、“身高”]、[“鲍勃”、“2”、“50”]、[“约翰”、“1”、“45”]、[“本”、“4”、“43”]、[“苏珊”、“3”、“48”];
常量arr3=[“姓名”、“id”、“家长”]、[“鲍勃”、“2”、“是”]、[“约翰”、“1”、“是”];
const result=合并表(arr1、arr2、arr3);
console.log(结果);

您可以在普通JavaScript中完成此操作。首先使用reduce方法将所有三个数组生成对象。然后再次使用reduce方法生成唯一的合并对象。最后,将对象生成数组

const arr1=[
[‘姓名’、‘身份证’、‘年龄’],
['Susan','3','20'],
['John','1','21'],
['Bob','2','23'],
[Ben',4',20'],
];
常数arr2=[
['name','id','height'],
['Bob','2','50'],
['John','1','45'],
[Ben',4',43'],
['Susan','3','48'],
];
常数arr3=[
['name','id','parent'],
['Bob','2','yes'],
['John','1','yes'],
];
const makeObject=(arr)=>{
const props=arr.slice(0,1).flat();
返回arr.slice(1).map((x)=>{
返回道具。减少((上一个,c,i)=>{
常数p=上一个;
p[c]=x[i];
返回p;
}, {});
});
};
const objArray=Object.values(
[…makeObject(arr1),…makeObject(arr2),…makeObject(arr3)]。减少(
(上一篇,c)=>{
常数p=上一个;
const key=c.id;
如果(!p[key])
p[键]={
…{name:'',id:'',age:'',height:'',parent:''},
C
};
else p[key]={…p[key],…c};
返回p;
},
{}
)
);
const ret=objArray.map((x)=>Object.values(x));
ret.unshift(Object.keys(objArray[0]);

console.log(ret);
我建议先创建一个对象。ES6语法允许您在几行内完成。这也解决了统一问题

const addData=([head,…data],obj={})=>(
data.reduce((acc,[名称,id,值])=>({
…acc,
[id]:{
…acc[id],
名称,[head[2]]:值
}
}),obj)
)
// -------
常数arr1=[
[“姓名”、“身份证”、“年龄”],
[“苏珊”、“3”、“20”],
[“约翰”、“1”、“21”],
[“鲍勃”、“2”、“23”],
[“本”、“4”、“20”]
];
常数arr2=[
[“名称”、“id”、“高度”],
[“鲍勃”、“2”、“50”],
[“约翰”、“1”、“45”],
[“本”、“4”、“43”],
[“苏珊”、“3”、“48”],
];
常数arr3=[
[“名称”、“id”、“父项”],
[“鲍勃”,“2”,“是”],
[“约翰”,“1”,“是”],
];
设indexedObj={}
indexedObj=addData(arr1,indexedObj)
indexedObj=addData(arr2,indexedObj)
indexedObj=addData(arr3,indexedObj)

console.log(indexedObj)
我同意你的观点……这将是一个艰难的过程。你有没有考虑过将你拥有的数组制作成对象?这样做,然后使用lodash的
mergeWith
可能是你最好的选择。