有没有办法使用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; }