2012-01-05 60 views
46

我需要一个js对象转换到另一个对象传递到服务器后,它的键的名称,例如不同有什么办法使用underscore.js

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

需要重命名JS对象键变成

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

在那里我有可用于映射所有键

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

查找obj是有没有本功能可以在underscore.js或jQuery中使用,可以使用这个功能吗?

谢谢

+3

不是下划线,但lodash具有[_.mapKeys](https://lodash.com/docs#mapKeys)用于修改对象的键。 – CookieMonster 2015-10-25 14:54:20

回答

26

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

var b = {}; 

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

否两个库中都没有明确重命​​名键的函数。您的方法也是最快的(请参阅jsperf tests。)如果可能,最好的办法是重构客户端或服务器端代码,以便对象相同。

+1

基准测试用例看起来并不相同。 – meandre 2015-04-22 13:45:55

1

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

<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> 
1

我有一个转换运算符,只是想将其应用于所有键。我分叉pimvdb的小提琴来产生一个简单的例子。在这种情况下,它将资本化的关键。它动态构建keymap,我需要保证工作(感谢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/

+0

虽然这个例子是人为设计出来的,但在现实生活中,我使用这种方法来使用数据集的第一条记录来构建“清理”键盘映射,然后将其应用于其余(可能包含额外的“加载”数据)。 – mr23 2014-04-29 21:55:18

+0

我最终使用了上面的_.replace()解决方案,但是我通过查看解决方案和PLUNK来开始。效果很好。谢谢 – FireDragon 2015-01-24 05:26:24

36

类似@pimvdb,你也可以用_.reduce做到这一点:

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

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

+1

提琴不工作了 – wegginho 2015-12-06 17:10:43

+0

似乎仍然适用于我@wegginho,它打印到控制台 – dule 2015-12-07 17:16:25

+0

我收到一个错误,下划线没有定义 – wegginho 2015-12-08 09:52:45

34

我知道你没有提及lodash,答案已经解决了这个问题,但是当我来到这里寻找一种方法来完成这件事时,我想别人可能会利用另一种方法。

由于@CookieMonster在评论中提到的,你可以用_.mapKeys做到这一点:

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

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

+1

这个副作用很强。 – DFlores009 2017-03-24 21:57:15

2

它已经在这里解决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; 
    }); 
}); 
10

您可以在值复制到与标准的JavaScript新特性,并与删除原始属性省略,如下:

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

请添加一些解释。目前,您的答案被标记为“低质量”,可能会被删除。 – 2016-03-02 09:07:31

0

由于user2387823使用above省略是一个很好的选择。例如,你可以写这样的事情

function updateObjKey(obj, currentKey, newKey) { 
    var keyValue = obj[currentKey]; 
    obj = _.omit(obj, [currentKey]); 
    obj[newKey] = keyValue; 
    return obj; 
    } 
1
// 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(); 
} 

这可能是比上面的回答慢。

相关问题