Javascript 根据首选项将对象合并为一个对象

Javascript 根据首选项将对象合并为一个对象,javascript,Javascript,我需要将所有优先于“X”和“and”的5个对象合并为一个 动态地,任何对象都可以为空 输入 const cpc = {"L1":"NA","L2":"X","L3":"NA","L4":"NA","L3L4":"AND"} const ph = {} const pt = {"L1":"NA","L2":"NA","L3":"X","L4":"NA","L3L4":"AND"} const cr = {"L1":"X","L2":"NA","L3":"NA","L

我需要将所有优先于“X”和“and”的5个对象合并为一个

动态地,任何对象都可以为空

输入

   const cpc = {"L1":"NA","L2":"X","L3":"NA","L4":"NA","L3L4":"AND"}
   const ph  = {} 
   const pt  = {"L1":"NA","L2":"NA","L3":"X","L4":"NA","L3L4":"AND"}
   const cr  = {"L1":"X","L2":"NA","L3":"NA","L4":"NA","L3L4":"NA"}
   const mi  = {}
输出:

const or = {"L1":"X","L2":"X","L3":"X","L4":"NA","L3L4":"AND"}
代码

我正在尝试合并1和2、3和4,并将1、2和5的输出合并,但不确定是否有更好的方法

   cr= Object.assign(...Object.keys(cpc).map(key => ({[key]: cpc[key] === "NA" ? ph[key] : cpc[key] })));
Bu我得到的错误为TypeError:如果对象为空,则无法将undefined或null转换为object

const cpc={“L1”:“NA”,“L2”:“X”,“L3”:“NA”,“L4”:“NA”,“L3L4”:“AND”};
常数ph={};
常数pt={“L1”:“NA”,“L2”:“NA”,“L3”:“X”,“L4”:“NA”,“L3L4”:“和”};
常数cr={“L1”:“X”,“L2”:“NA”,“L3”:“NA”,“L4”:“NA”,“L3L4”:“NA”};
常数mi={};
常数结果=[cpc、ph、pt、cr、mi]
.map(Object.entries)
.flat().reduce((a[k,v])=>({
A.
[k] :!a[k]| a[k]=“NA”?v:a[k]
}), {});
控制台日志(结果)以下是一种方法,可将输入数组化,并简化为结果对象:

const cpc={“L1”:“NA”,“L2”:“X”,“L3”:“NA”,“L4”:“NA”,“L3L4”:“AND”};
常数ph={};
常数pt={“L1”:“NA”,“L2”:“NA”,“L3”:“X”,“L4”:“NA”,“L3L4”:“和”};
常数cr={“L1”:“X”,“L2”:“NA”,“L3”:“NA”,“L4”:“NA”,“L3L4”:“NA”};
常数mi={};
常数结果=[cpc、ph、pt、cr、mi]
.map(Object.entries)
.flat().reduce((a[k,v])=>({
A.
[k] :!a[k]| a[k]=“NA”?v:a[k]
}), {});

控制台日志(结果)方法:从所有对象中创建一个数组,并在每个对象中循环,将结果存储在temp对象中。检查temp对象是否已经包含“X”和“and”作为键的值,否则创建新的键值对

const cpc={“L1”:“NA”,“L2”:“X”,“L3”:“NA”,“L4”:“NA”,“L3L4”:“AND”}
常数ph={}
常数pt={“L1”:“NA”,“L2”:“NA”,“L3”:“X”,“L4”:“NA”,“L3L4”:“和”}
常数cr={“L1”:“X”,“L2”:“NA”,“L3”:“NA”,“L4”:“NA”,“L3L4”:“NA”}
常数mi={}
常数objs=[cpc、ph、pt、cr、mi]
常量tempObj={}
objs.forEach((obj)=>{
Object.keys(obj.forEach)((key)=>{
如果(!(tempObj[key]=“X”| | tempObj[key]=“AND”)){
tempObj[key]=obj[key]
}
})
})

log(tempObj)
方法:从所有对象中创建一个数组,并在每个对象中循环,将结果存储在temp对象中。检查temp对象是否已经包含“X”和“and”作为键的值,否则创建新的键值对

const cpc={“L1”:“NA”,“L2”:“X”,“L3”:“NA”,“L4”:“NA”,“L3L4”:“AND”}
常数ph={}
常数pt={“L1”:“NA”,“L2”:“NA”,“L3”:“X”,“L4”:“NA”,“L3L4”:“和”}
常数cr={“L1”:“X”,“L2”:“NA”,“L3”:“NA”,“L4”:“NA”,“L3L4”:“NA”}
常数mi={}
常数objs=[cpc、ph、pt、cr、mi]
常量tempObj={}
objs.forEach((obj)=>{
Object.keys(obj.forEach)((key)=>{
如果(!(tempObj[key]=“X”| | tempObj[key]=“AND”)){
tempObj[key]=obj[key]
}
})
})

log(tempObj)
您可以减少包含对象的数组,并提前检查值

const
合并=(a,b)=>Object.entries(b).reduce((o[k,v])=>{
如果(!['X','和'])包括(o[k])o[k]=v;
返回o;
},a),
cpc={L1:“NA”,L2:“X”,L3:“NA”,L4:“NA”,L3L4:“和”},
ph={},
pt={L1:“NA”,L2:“NA”,L3:“X”,L4:“NA”,L3L4:“和”},
cr={L1:“X”,L2:“NA”,L3:“NA”,L4:“NA”,L3L4:“NA”},
mi={},
合并=[cpc,ph,pt,cr,mi].reduce(合并,{});

console.log(合并)您可以使用对象减少数组,并提前检查值

const
合并=(a,b)=>Object.entries(b).reduce((o[k,v])=>{
如果(!['X','和'])包括(o[k])o[k]=v;
返回o;
},a),
cpc={L1:“NA”,L2:“X”,L3:“NA”,L4:“NA”,L3L4:“和”},
ph={},
pt={L1:“NA”,L2:“NA”,L3:“X”,L4:“NA”,L3L4:“和”},
cr={L1:“X”,L2:“NA”,L3:“NA”,L4:“NA”,L3L4:“NA”},
mi={},
合并=[cpc,ph,pt,cr,mi].reduce(合并,{});

console.log(合并)