Javascript 关联并合并同一部门的数组
我正在开发一个应用程序,在这个应用程序中,我需要根据 第二个数组中提供的条件,并将关系附加到对象Javascript 关联并合并同一部门的数组,javascript,Javascript,我正在开发一个应用程序,在这个应用程序中,我需要根据 第二个数组中提供的条件,并将关系附加到对象 let inArr1 = [{"D1D2":"AND"},{"D3D4":"OR"}] let inArr2 =[{"ID":"1","NAME":"KEN","DEPT1":"CSE"}, {"ID":"2","NAME":"MARK","DEPT2":"IT"}, {"ID":"3","NAME":"TOM","DEPT3":"ECE"},
let inArr1 = [{"D1D2":"AND"},{"D3D4":"OR"}]
let inArr2 =[{"ID":"1","NAME":"KEN","DEPT1":"CSE"},
{"ID":"2","NAME":"MARK","DEPT2":"IT"},
{"ID":"3","NAME":"TOM","DEPT3":"ECE"},
{"ID":"4","NAME":"SHIV","DEPT4":"LIB"},
{"ID":"5","NAME":"TIM","DEPT5":"SEC"}
]
输出
outArr ={
[{"ID":"1","NAME":"KEN","DEPT1":"CSE","REL":"AND"},
{"ID":"2","NAME":"MARK","DEPT2":"IT","REL":"AND"}], //Arr1
[{"ID":"3","NAME":"TOM","DEPT3":"ECE","REL":"OR"},
{"ID":"4","NAME":"SHIV","DEPT4":"LIB","REL":"OR"}], //Arr2
[{"ID":"5","NAME":"TIM","DEPT5":"SEC"}] //Arr3
}
代码:
let condArr=[],outArr,i=1;
inArr1.forEach(condt => {
let dept = Object.keys(condt)[0];
let tmparr = dept.split("D");
tmparr.shift()
condArr.push(tmparr)
});
inArr2.forEach(condt => {
if(condArr.includes(inArr2.D+i)){
i++;
outArr.push(inArr2);
}
});
您的代码逻辑有点混乱,我建议您这样做
let inArr1 = [{"D1D2":"AND"},{"D3D4":"OR"},{"D5D6":"AND"}]
let inArr2 =[{"ID":"1","NAME":"KEN","DEPT1":"CSE"},
{"ID":"2","NAME":"MARK","DEPT2":"IT"},
{"ID":"3","NAME":"TOM","DEPT3":"ECE"},
{"ID":"4","NAME":"SHIV","DEPT4":"LIB"},
{"ID":"5","NAME":"TIM","DEPT5":"SEC"},
{"ID":"6","NAME":"TLA","DEPT6":"SEC"},
]
// first lets create object of ids as keys and conditions as values
const [keys, conditions] = inArr1.reduce((agg, cond, index) => {
Object.entries(cond).forEach(([key, value]) => {
key.split('D').forEach(v => { if (v) agg[0][v] = { value, index }})
agg[1].push([])
})
return agg
}, [{}, []]) // {1: "AND", 2: "AND", 3: "OR", 4: "OR"}
conditions.push([])
// and now just map over all elements and add condition if we found id from the keys
inArr2.forEach(item => {
const cond = keys[item.ID]
if (cond) conditions[cond.index].push({...item, REL: cond.value})
else conditions[conditions.length - 1].push(item)
})
const res = conditions.filter(v => v.length)
console.log(res)
您的代码逻辑有点混乱,我建议您这样做
let inArr1 = [{"D1D2":"AND"},{"D3D4":"OR"},{"D5D6":"AND"}]
let inArr2 =[{"ID":"1","NAME":"KEN","DEPT1":"CSE"},
{"ID":"2","NAME":"MARK","DEPT2":"IT"},
{"ID":"3","NAME":"TOM","DEPT3":"ECE"},
{"ID":"4","NAME":"SHIV","DEPT4":"LIB"},
{"ID":"5","NAME":"TIM","DEPT5":"SEC"},
{"ID":"6","NAME":"TLA","DEPT6":"SEC"},
]
// first lets create object of ids as keys and conditions as values
const [keys, conditions] = inArr1.reduce((agg, cond, index) => {
Object.entries(cond).forEach(([key, value]) => {
key.split('D').forEach(v => { if (v) agg[0][v] = { value, index }})
agg[1].push([])
})
return agg
}, [{}, []]) // {1: "AND", 2: "AND", 3: "OR", 4: "OR"}
conditions.push([])
// and now just map over all elements and add condition if we found id from the keys
inArr2.forEach(item => {
const cond = keys[item.ID]
if (cond) conditions[cond.index].push({...item, REL: cond.value})
else conditions[conditions.length - 1].push(item)
})
const res = conditions.filter(v => v.length)
console.log(res)
您可以使用
ID
存储GOUP并使用新对象
让inArr1=[{D1D2:“和”},{D3D4:“或”}],
INAR2=[{ID:“1”,姓名:“肯”,部门1:“CSE”},{ID:“2”,姓名:“马克”,部门2:“IT”},{ID:“3”,姓名:“汤姆”,部门3:“ECE”},{ID:“4”,姓名:“希夫”,部门4:“LIB”},{ID:“5”,姓名:“蒂姆”,部门5:“SEC”},
组=INAR1。减少((r,o)=>{
Object.entries(o.forEach)([k,REL])=>{
var对象={REL,组:[]};
k、 匹配(/[^D]+/g).forEach(id=>r[id]=object);
});
返回r;
}, {}),
分组=INAR2。减少((r,o)=>{
var{REL,group}=组[o.ID]|{};
国际单项体育联合会(小组){
如果(!group.length)r.push(组);
push(Object.assign({},o,{REL}));
}否则{
r、 推挤([o]);
}
返回r;
}, []);
控制台日志(分组)代码>
。作为控制台包装{max height:100%!important;top:0;}
您可以使用ID
存储GOUP并使用新对象
让inArr1=[{D1D2:“和”},{D3D4:“或”}],
INAR2=[{ID:“1”,姓名:“肯”,部门1:“CSE”},{ID:“2”,姓名:“马克”,部门2:“IT”},{ID:“3”,姓名:“汤姆”,部门3:“ECE”},{ID:“4”,姓名:“希夫”,部门4:“LIB”},{ID:“5”,姓名:“蒂姆”,部门5:“SEC”},
组=INAR1。减少((r,o)=>{
Object.entries(o.forEach)([k,REL])=>{
var对象={REL,组:[]};
k、 匹配(/[^D]+/g).forEach(id=>r[id]=object);
});
返回r;
}, {}),
分组=INAR2。减少((r,o)=>{
var{REL,group}=组[o.ID]|{};
国际单项体育联合会(小组){
如果(!group.length)r.push(组);
push(Object.assign({},o,{REL}));
}否则{
r、 推挤([o]);
}
返回r;
}, []);
控制台日志(分组)代码>
.as控制台包装{max height:100%!important;top:0;}
可以尝试其他解决方案:
让inArr1=[{D1D2:“AND”},{D3D4:“OR”},{D6D7:“XOR”}];
让r2=[
{ID:“1”,NAME:“KEN”,DEPT1:“CSE”},
{ID:“2”,NAME:“MARK”,DEPT2:“IT”},
{ID:“3”,姓名:“汤姆”,部门3:“欧洲经委会”},
{ID:“4”,名字:“SHIV”,DEPT4:“LIB”},
{ID:“5”,姓名:“TIM”,部门5:“SEC”},
{ID:“9”,NAME:“BAR”,DEPT5:“XYZ”},
{ID:“6”,名称:“FOO”,DEPT5:“XYZ”},
];
让取消匹配器=[]
让matchedArr=inArr2.reduce((acc,obj)=>{
//从INAR1对象键获取匹配的索引
const indexMatched=getIndexMatch(对象ID);
//创建索引(如果不存在)
如果(!acc[indexMatched]&&indexMatched!==null)acc[indexMatched]=[];
//如果某个索引与之匹配,则将当前obj与带有INAR1[indexMatched]键=>值的DEL属性合并
返回indexMatched!==null
?附件[indexMatched]。推送({
…obj,
DEL:inArr1[indexMatched][Object.keys(inArr1[indexMatched])[0]]
})
//推进非匹配器
:取消匹配。推送(obj)
,acc
}, []);
函数getIndexMatch(id){
for(inArr1.entries()的常量[index,obj]){
for(对象的常量键。键(obj)){
//仅拆分对象当前键的数字
if(key.match(/\d/g).includes(id))返回索引;//包含INAR1 if的返回索引
}
}
返回null;
}
//合并数组
常量结果=[…匹配的DARR,不匹配的DARR];
控制台日志(结果)代码>可以尝试其他解决方案:
让inArr1=[{D1D2:“AND”},{D3D4:“OR”},{D6D7:“XOR”}];
让r2=[
{ID:“1”,NAME:“KEN”,DEPT1:“CSE”},
{ID:“2”,NAME:“MARK”,DEPT2:“IT”},
{ID:“3”,姓名:“汤姆”,部门3:“欧洲经委会”},
{ID:“4”,名字:“SHIV”,DEPT4:“LIB”},
{ID:“5”,姓名:“TIM”,部门5:“SEC”},
{ID:“9”,NAME:“BAR”,DEPT5:“XYZ”},
{ID:“6”,名称:“FOO”,DEPT5:“XYZ”},
];
让取消匹配器=[]
让matchedArr=inArr2.reduce((acc,obj)=>{
//从INAR1对象键获取匹配的索引
const indexMatched=getIndexMatch(对象ID);
//创建索引(如果不存在)
如果(!acc[indexMatched]&&indexMatched!==null)acc[indexMatched]=[];
//如果某个索引与之匹配,则将当前obj与带有INAR1[indexMatched]键=>值的DEL属性合并
返回indexMatched!==null
?附件[indexMatched]。推送({
…obj,
DEL:inArr1[indexMatched][Object.keys(inArr1[indexMatched])[0]]
})
//推进非匹配器
:取消匹配。推送(obj)
,acc
}, []);
函数getIndexMatch(id){
for(inArr1.entries()的常量[index,obj]){
for(对象的常量键。键(obj)){
//仅拆分对象当前键的数字
if(key.match(/\d/g).includes(id))返回索引;//包含INAR1 if的返回索引
}
}
返回null;
}
//合并数组
常量结果=[…匹配的DARR,不匹配的DARR];
控制台日志(结果)代码>谢谢。对关系中提到的对象进行分组不存在。@MKN,oops,没错,我更改了答案,请检查是否仍然存在actual@MKN,它应该是,我看到的唯一问题是,它最后显示了一个空数组,但为此,您应该将最后一行更改为“const res=Object.entries(conditions).filter(v=>v[1].length.map(v=>v[1])”@MKN您的评论触动了我的心,我将尝试=)@MKN,现在检查,请确认。对关系中提到的对象进行分组不存在。@MKN,oops,没错,我更改了答案,请检查是否仍然存在actual@MKN,它应该是,我看到的唯一问题是,它最后显示了一个空数组,但为此,您应该将最后一行更改为“const res=Object.entries(conditi