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



我需要将所有优先于"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 我收到错误作为类型错误:如果对象为空,则无法将未定义或 null 转换为对象

下面是一种扁平化输入数组并简化为结果对象的方法:

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 result =  [cpc, ph, pt, cr, mi]
.map(Object.entries)
.flat().reduce((a, [k, v]) => ({
...a,
[k]: !a[k] || a[k] === 'NA' ? v : a[k]
}), {});
console.log(result);

方法:从所有对象中创建一个数组,并遍历每个对象,将结果存储在 temp 对象中。检查临时对象是否已包含"X"和"AND"作为键的值,否则创建新的键值对

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 objs = [cpc, ph, pt, cr, mi]
const tempObj = {}
objs.forEach((obj) => {
Object.keys(obj).forEach((key) => {
if (!(tempObj[key] == "X" || tempObj[key] == "AND")) {
tempObj[key] = obj[key]
}
})
})
console.log(tempObj)

您可以使用对象减少数组并提前检查值。

const
merge = (a, b) => Object.entries(b).reduce((o, [k, v]) => {
if (!['X', 'AND'].includes(o[k])) o[k] = v;
return o;
}, a),
cpc = { L1: "NA", L2: "X", L3: "NA", L4: "NA", L3L4: "AND" },
ph = {},
pt = { L1: "NA", L2: "NA", L3: "X", L4: "NA", L3L4: "AND" },
cr = { L1: "X", L2: "NA", L3: "NA", L4: "NA", L3L4: "NA" },
mi = {},
merged = [cpc, ph, pt, cr, mi].reduce(merge, {});
console.log(merged);

最新更新