Lodash pickAs方法:如何将对象属性映射到新对象的不同键名?
当然可以实现这种「选取指定属性同时重命名键」的需求!不管是用原生JavaScript自己封装函数,还是借助Lodash这类工具库,都能轻松搞定。下面结合你的示例来具体说明:
一、原生JavaScript实现
自己写一个pickAs函数其实非常直观,核心思路就是遍历你的属性映射规则,从原对象中取出对应值,再赋值给新的键名即可:
function pickAs(obj, keyMap) { const result = {}; // 遍历映射规则里的每一组原键→新键关系 for (const originalKey in keyMap) { // 只处理原对象自身拥有的属性(可选,按需去掉) if (obj.hasOwnProperty(originalKey)) { const newKey = keyMap[originalKey]; result[newKey] = obj[originalKey]; } } return result; } // 测试你的示例 const a = {prop1: 'a', prop2: 'b', prop3: 'c'}; const mappedObj = pickAs(a, {prop1: 'first', prop3: 'second'}); console.log(mappedObj); // 输出: {first: 'a', second: 'c'}
如果不需要过滤继承属性的逻辑,直接去掉hasOwnProperty的判断就行,代码会更简洁。
二、用Lodash实现
虽然Lodash没有直接提供名为pickAs的方法,但我们可以用它的现有工具函数组合出相同效果,比如用_.reduce来处理:
const _ = require('lodash'); // 把pickAs挂载到Lodash上(也可以单独作为函数) _.pickAs = function(obj, keyMap) { return _.reduce(keyMap, (result, newKey, originalKey) => { if (_.has(obj, originalKey)) { result[newKey] = obj[originalKey]; } return result; }, {}); }; // 测试示例 const a = {prop1: 'a', prop2: 'b', prop3: 'c'}; const mappedObj = _.pickAs(a, {prop1: 'first', prop3: 'second'}); console.log(mappedObj); // 输出: {first: 'a', second: 'c'}
你也可以用「先选属性再重命名」的组合写法,先通过_.pick筛选出需要的属性,再用_.mapKeys替换键名:
const _ = require('lodash'); const a = {prop1: 'a', prop2: 'b', prop3: 'c'}; const keyMap = {prop1: 'first', prop3: 'second'}; const mappedObj = _.mapKeys( _.pick(a, Object.keys(keyMap)), (value, originalKey) => keyMap[originalKey] ); console.log(mappedObj); // 输出: {first: 'a', second: 'c'}
两种写法都能达到预期效果,看你个人习惯选择就好~
内容的提问来源于stack exchange,提问作者Jan Tajovsky
相关产品推荐
相关产品推荐

