2012-01-05 62 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(); 
} 

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

相關問題