我在nodejs中有一个带值的数组和一个映射.如何为映射中不存在的值创建null值



我在节点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});

最新更新