有没有办法使用underscore.js重命名js对象键

我需要将一个js对象转换为另一个对象,以传递到服务器上的键名称不同例如

var a = { name : "Foo", amount: 55, reported : false, ... <snip/> ... date : "10/01/2001" } 

需要变成

 a = { id : "Foo", total : 55, updated: false, ... <snip/> ... issued : "10/01/2001" } 

我在那里查找obj可用于映射所有的键

 var serverKeyMap = { name : "id", amount : "total", reported : "updated", ... date : "issue" } 

在underscore.js或jQuery中是否有可用的函数呢?

谢谢

据我所知,这两个库都没有内置函数。 你可以很容易地创build自己的: http : //jsfiddle.net/T9Lnr/1/ 。

 var b = {}; _.each(a, function(value, key) { key = map[key] || key; b[key] = value; }); 

和@pimvdb类似,你也可以用_.reduce

 _.reduce(a, function(result, value, key) { key = map[key] || key; result[key] = value; return result; }, {}); 

小提琴: http : //jsfiddle.net/T9Lnr/39/

我知道你没有提到lodash ,答案已经解决了这个问题,但当我来到这里寻找一个方法来做到这一点,我想其他人可能会利用替代scheme。

作为@CookieMonster在评论中提到,你可以用_.mapKeys做到这_.mapKeys

 _.mapKeys(a, function(value, key) { return serverKeyMap[key]; }); 

和小提琴: http : //jsfiddle.net/cwkwtgr3/

您可以使用标准JavaScript将这些值复制到新的属性中,然后使用省略的方式删除原始属性,如下所示:

 a.id = a.name; a.total = a.amount; a.updated = a.reported; a = _.omit(a, 'name', 'amount', 'reported'); 

这里已经解决了https://stackoverflow.com/a/30940370/1360897

 var keyMapping = {'PropertyA': 'propertyA', ..., 'PropertyF': 'propertyNEW'} 

还有像这样的新旧价值观的映射

 var valueMapping = {'Y': true, 'F': false} 

然后使用_.map和_.transform,可以像这样转换对象

 var result = _.map(allItems, function(currentObject) { return _.transform(currentObject, function(result, value, key) { if (key === 'PropertyF' || key === 'PropertyG') { value = valueMapping(value); } result[keyMapping[key]] = value; }); }); 

不,没有明确重命​​名密钥的函数库。 您的方法也是最快的(请参阅jsperftesting 。)如果可能,最好的方法是重构客户端或服务器端代码,以使对象相同。

我有一个转换操作符,只是想把它应用到所有的键。 我分叉pimvdb的小提琴来产生一个简单的例子。 在这种情况下,它大写关键。 它dynamic地构build键盘映射,我需要保证工作(感谢JSFiddle)。

这是更改的代码:

 var keymap = {}; _.each(a, function(value, key) { var oldkey = key; key = capitalize(key); keymap[oldkey] = key; }); _.each(a, function(value, key) { key = keymap[key] || key; b[key] = value; }); 

小提琴: http : //jsfiddle.net/mr23/VdNjf/

 // key_map: {old_name1: new_name1, ... } function rename_keys(object, key_map, is_picked=false){ keys = _.keys(key_map); new_keys = _.values(key_map); picked = _.pick(object, keys); renamed = _.object(new_keys, _.values(picked)); if(is_picked) return renamed; return _.chain(object).omit(keys).extend(renamed).value(); } 

这可能比上面的答案慢。

你为什么不使用这个简单的Java脚本? 任何键值对都应该是string/数字/布尔值。

 <script type="text/javascript"> var serverKeyMap = { name : "id", amount : "total", reported : "updated" }; var a = { name : "Foo", amount: 55, reported : false }; var b={}; // b is object where you will get your output for(i in serverKeyMap) b[serverKeyMap[i]]=a[i]; console.log(b); // It gives what you need. </script> 

正如user2387823 上面说的,使用omit是个不错的select。 例如,你可以写这样的东西

 function updateObjKey(obj, currentKey, newKey) { var keyValue = obj[currentKey]; obj = _.omit(obj, [currentKey]); obj[newKey] = keyValue; return obj; }