我在节点js中有一个包含值和映射的数组。如何为映射中不存在的值创建null值?
map = [
{ CATALOG: "123", ASSEMBLY_ID: "abc" },
{ CATALOG: "456", ASSEMBLY_ID: "pqr" },
];
array = ["abc", "def", "xyz", "pqr"];
预期输出
map = [
{ CATALOG: "123", cost: "abc" },
{ CATALOG: "456", cost: "pqr" },
{ CATALOG: null, cost: "def" },
{ CATALOG: null, cost: "xyz" },
];
稳健的解决方案是:
const result = array.map(el => {
const correspondingItem = map.find(e => e.ASSEMBLY_ID === el)
return ({CATALOG: null, ...correspondingItem, ASSEMBLY_ID: el});
})
但是,如果您希望您的字段具有一定的灵活性,您可以迭代obj字段:
const classKeys = Object.keys(map[0]);
const result = array.map(el => {
const correspondingItem = map.find(e => e.ASSEMBLY_ID === el);
return classKeys.reduce((acc, key) => {
acc[key] = correspondingItem?.[key] || null
return acc
}, {})
})
对于更全面的情况,我建议使用lodash
- 这可以使用
- 首先将给定的对象数组转换为一个对象,以便于以后执行搜索
- 随后在给定数组上映射/循环,并在上述步骤中创建的对象中搜索给定键,从而根据键"CATALOG"是否在最初给定的对象数组中找到,有条件地分配该值
let theMap = [
{ CATALOG: "123", ASSEMBLY_ID: "abc" },
{ CATALOG: "456", ASSEMBLY_ID: "pqr" },
];
let theArray = ["abc", "def", "xyz", "pqr"];
let theMap2 = theMap.reduce((obj, cur) =>
({...obj, [cur.ASSEMBLY_ID]: cur}),
{}
);
let output = theArray.map(x=>({
'CATALOG': theMap2[x]?.CATALOG || null,
'cost': x
}));
console.log({output});