JavaScript中按允许键过滤对象并映射自定义新键名的方法
实现键过滤+友好键名映射的对象转换
这问题我日常开发中经常碰到,本质就是把键过滤和键名重映射两个逻辑结合起来就行。我拿JavaScript举个例子,其他语言的思路完全相通,无非是遍历、判断、赋值这几步。
核心思路拆解
要实现这个需求,你需要先明确三个核心数据:
- 原对象:包含所有原始键值对的数据源
- 允许键列表:指定哪些原键需要保留(过滤规则)
- 键名映射表:定义原键对应到友好键名的关系
然后只需要遍历允许键列表,对每个键做两个检查:
- 原对象里是否存在这个键(避免无效键)
- 映射表里是否有对应的友好键名(可选,根据业务需求处理)
最后把符合条件的键值对以友好键名存入新对象即可。
代码示例(JavaScript)
先看最直观的实现方式:
// 原对象 const originalObj = { id: 123, user_name: "johndoe", age: 30, irrelevant_key: "这是不需要的字段" }; // 允许保留的原键列表 const allowedKeys = ["id", "user_name", "age"]; // 原键 → 友好键名的映射表 const keyMapping = { id: "用户ID", user_name: "用户名", age: "年龄" }; // 转换函数 function transformToFriendlyObj(original, allowedKeys, keyMap) { const result = {}; allowedKeys.forEach(key => { // 确保原对象存在该键,且映射表有对应的友好键 if (original.hasOwnProperty(key) && keyMap[key]) { result[keyMap[key]] = original[key]; } }); return result; } // 调用得到目标对象 const friendlyObj = transformToFriendlyObj(originalObj, allowedKeys, keyMapping); console.log(friendlyObj); // 输出结果:{ "用户ID": 123, "用户名": "johndoe", "年龄": 30 }
如果喜欢更简洁的写法,可以用reduce一行搞定:
const friendlyObj = allowedKeys.reduce((acc, key) => { if (originalObj[key] !== undefined && keyMapping[key]) { acc[keyMapping[key]] = originalObj[key]; } return acc; }, {});
额外注意事项
- 如果某些原键没有对应的友好键名,你可以选择:直接保留原键作为新键,或者跳过该键,或者设个默认名,比如
keyMapping[key] || key - 如果你不需要严格检查原对象是否存在该键(允许值为
undefined的键保留),可以去掉hasOwnProperty或undefined的判断 - 要是用TypeScript的话,还可以给类型做约束,避免键名不匹配的问题
内容的提问来源于stack exchange,提问作者moaningalways
相关产品推荐
相关产品推荐

