Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/428.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 关联并合并同一部门的数组_Javascript - Fatal编程技术网

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