如何使用Object.assign通过转换层将两个对象生成新对象?
用Object.assign实现对象转换的方案
嘿,这个需求用Object.assign完全可以搞定,我先给你梳理下思路,再配上具体的代码示例,你一看就明白~
首先咱们先明确下场景,用示例数据更直观:
假设你的两个对象是这样的:
// 包含id的源对象 const mapObj = { product1: { id: 'apple', price: 5 }, product2: { id: 'banana', price: 3 }, product3: { id: 'orange', price: 4 } }; // 键为id、值为对应内容的参考对象 const refer = { apple: '红富士苹果', banana: '广西香蕉' };
你的需求是:生成一个新对象,当mapObj里某个条目的id和refer的键匹配时,就用refer对应的值替换该条目;不匹配的话可以选择保留原条目或者忽略,下面分两种情况给你实现:
情况1:保留所有条目,匹配的替换值,不匹配的保留原内容
const transformedObj = Object.assign( {}, // 目标空对象,用来接收合并后的结果 ...Object.entries(mapObj).map(([key, item]) => { // 检查当前item的id是否在refer中有对应值 const targetValue = refer[item.id]; // 返回一个仅包含当前key的小对象,值根据匹配情况选择 return { [key]: targetValue !== undefined ? targetValue : item }; }) ); console.log(transformedObj); // 输出结果: // { // product1: '红富士苹果', // product2: '广西香蕉', // product3: { id: 'orange', price: 4 } // }
情况2:仅保留匹配的条目,不匹配的直接剔除
const transformedObj = Object.assign( {}, ...Object.entries(mapObj).map(([key, item]) => { const targetValue = refer[item.id]; // 如果匹配到值就返回带key的对象,否则返回空对象(不会添加任何属性) return targetValue !== undefined ? { [key]: targetValue } : {}; }) ); console.log(transformedObj); // 输出结果: // { // product1: '红富士苹果', // product2: '广西香蕉' // }
核心逻辑解释:
- 用
Object.entries(mapObj)把mapObj转换成键值对数组,方便遍历每个条目; - 通过
map方法把每个条目转换成一个仅包含当前key的小对象:匹配到refer的值就用该值,否则根据需求返回原内容或空对象; - 用展开运算符
...把这些小对象作为参数传给Object.assign,它会自动把所有小对象的属性合并到第一个空对象里,最终得到我们需要的新对象。
内容的提问来源于stack exchange,提问作者fscore
相关产品推荐
相关产品推荐

