如何根据对象type属性值为数组对象高效新增newProp属性?
高效处理对象数组属性映射的方案
嘿,我来给你分享几个比for循环加一堆if更优雅高效的解决方案,不仅代码更简洁,后续维护起来也省心多啦~
方案一:映射对象 + Array.map()(最推荐)
这种方式把type和newProp的对应关系抽成一个映射表,逻辑清晰直观,后续新增或修改类型只需要调整映射表,完全不用动遍历逻辑,符合开放封闭原则。
const myArray = [ {id: "1", type: "xxx"}, {id: "2", type: "abc"}, {id: "3", type: "xxx"}, {id: "4", type: "yyy"} ]; // 定义type到newProp的映射关系,一目了然 const typeToPropMap = { "xxx": "prop1", "abc": "prop2", "yyy": "prop3" }; // 使用map生成新数组(不会修改原数组,更安全) const resultArray = myArray.map(item => ({ ...item, // 展开原对象的所有属性 newProp: typeToPropMap[item.type] || '默认值' // 可选:给未匹配的type加默认值 })); console.log(resultArray);
好处:代码可读性拉满,维护成本极低,map方法是数组的标准高阶方法,语义明确,比手动写for循环更简洁。
方案二:Map对象(适合复杂逻辑场景)
如果你的newProp需要根据type做一些动态计算(比如调用函数、拼接字符串),用Map对象会比普通对象更灵活,它支持函数作为值:
const myArray = [ {id: "1", type: "xxx"}, {id: "2", type: "abc"}, {id: "3", type: "xxx"}, {id: "4", type: "yyy"} ]; // 用Map存储映射,支持复杂逻辑 const typePropMap = new Map([ ["xxx", "prop1"], ["abc", () => `prop2_${Date.now()}`], // 比如动态生成带时间戳的属性值 ["yyy", "prop3"] ]); const resultArray = myArray.map(item => { const propValue = typePropMap.get(item.type); return { ...item, newProp: typeof propValue === 'function' ? propValue() : propValue || '默认值' }; });
好处:比普通对象更灵活,能处理动态生成newProp的场景,而且Map的键可以是任意类型(不过这里用字符串就够了)。
方案三:直接修改原数组(forEach + 映射对象)
如果不需要保留原数组,想直接给原对象添加属性,可以用forEach遍历修改:
const myArray = [ {id: "1", type: "xxx"}, {id: "2", type: "abc"}, {id: "3", type: "xxx"}, {id: "4", type: "yyy"} ]; const typeToPropMap = { "xxx": "prop1", "abc": "prop2", "yyy": "prop3" }; // 直接修改原数组中的对象 myArray.forEach(item => { item.newProp = typeToPropMap[item.type] || '默认值'; });
注意:这种方式会改变原数组的对象,如果你需要原数组保持不变,就别用这个方案。
内容的提问来源于stack exchange,提问作者Leo Messi
相关产品推荐
相关产品推荐

