javascript - 关联并合并同一部门的数组

标签 javascript

我正在开发一个应用程序,我需要根据以下内容组契约(Contract)一部门的对象 第二个数组中提供的条件并将关系附加到对象。

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)

关于javascript - 关联并合并同一部门的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59446875/

相关文章:

javascript - CSS 元素样式在 MouseDown 上设置正确,为什么在 MouseUp 上不希望重置?

javascript - 我怎么知道对象文字包含多少项?

javascript - React Native fetch() 返回奇怪的 json 响应项

javascript - 仅从客户端检测下载开始/文件传输的开始

javascript - Javascript 左侧的可选链接

带有跨浏览器换行符的 Javascript 预格式化文本

javascript - Angular 5/6 : Handle File Download (w/Friendly File Name) from ASP. NET 核心 API HTTP

javascript - 拒绝直接访问 IIS Web 服务器中的 JavaScript 文件

javascript - 当我们为元素设置新的 html 时,如何保存事件处理程序?

javascript - 从 setTimeout 函数中返回值