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

cla*_*aya 59 javascript jquery underscore.js

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

var a = {
    name : "Foo",
    amount: 55,
    reported : false,
    ...
    <snip/>
    ...
    date : "10/01/2001"
    } 
Run Code Online (Sandbox Code Playgroud)

需要变成

a = {
  id : "Foo",
  total : 55,
  updated: false,
  ...
  <snip/>
  ... 
  issued : "10/01/2001"
  }
Run Code Online (Sandbox Code Playgroud)

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

var serverKeyMap = {
    name : "id",
    amount : "total",
    reported : "updated",
     ...
    date : "issue"
    }
Run Code Online (Sandbox Code Playgroud)

是否有一个函数可用于underscore.js或jQuery,我可以使用它来执行此功能?

谢谢

Sam*_*iar 65

我知道你没有提到lodash并且答案已经解决了问题,但其他人可能会利用替代方案.

正如@CookieMonster在评论中提到的那样,你可以这样做_.mapKeys:

_.mapKeys(a, function(value, key) {
    return serverKeyMap[key];
});
Run Code Online (Sandbox Code Playgroud)

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

  • 这个副作用很强. (4认同)

dul*_*ule 40

与@pimvdb类似,您也可以使用_.reduce:

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

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


pim*_*vdb 33

据我所知,这两个库中没有内置任何功能.不过你可以轻松地制作自己的:http://jsfiddle.net/T9Lnr/1/.

var b = {};

_.each(a, function(value, key) {
    key = map[key] || key;
    b[key] = value;
});
Run Code Online (Sandbox Code Playgroud)


小智 11

您可以使用标准JavaScript将值复制到新属性,并使用省略删除原始属性,如下所示:

a.id = a.name;
a.total = a.amount;
a.updated = a.reported;
a = _.omit(a, 'name', 'amount', 'reported');
Run Code Online (Sandbox Code Playgroud)