2014-04-11 49 views
31

我有結構化的這樣一個非常大的JSON對象:切換鍵

{A : 1, B : 2, C : 3, D : 4} 

我需要一個可以在我的對象鍵交換值的功能,我不知道該怎麼做。我需要一個像這樣的輸出:

{1 : A, 2 : B, 3 : C, 4 : D} 

有什麼辦法,我可以做這將手動創建的一切是換一個新的對象?
感謝

+1

是否都是數值並重複數字?如果這些值重複出現,那麼您將無法交換它們,因爲它們會覆蓋其他值,除非您將它們的值更改爲某個唯一值。可能有更好的解決方案需要交換的原因是什麼? –

+0

@PatrickEvans他們都是數字,但他們不重複。我試圖做一個基本的密碼。 – C1D

回答

45
function swap(json){ 
    var ret = {}; 
    for(var key in json){ 
    ret[json[key]] = key; 
    } 
    return ret; 
} 

例這裏FIDDLE不要忘記把你的控制檯上看到的結果。

+0

非常感謝您的支持!我已經搜索了所有stackexchange並找不到答案。 – C1D

+0

不客氣:) – jPO

+1

這個美麗的作品也適用於'javascript'。+ 1vote – AXL

21

獲取對象的關鍵字,然後使用Array的reduce函數遍歷每個關鍵字並將該值設置爲關鍵字,並將關鍵字設置爲值。

var data = {A : 1, B : 2, C : 3, D : 4} 
var newData = Object.keys(data).reduce(function(obj,key){ 
    obj[ data[key] ] = key; 
    return obj; 
},{}); 
console.log(newData); 
15

可以使用lodash功能_.invert它也可以使用multivlaue

var object = { 'a': 1, 'b': 2, 'c': 1 }; 

    _.invert(object); 
    // => { '1': 'c', '2': 'b' } 

    // with `multiValue` 
    _.invert(object, true); 
    // => { '1': ['a', 'c'], '2': ['b'] } 
11

在ES6/ES2015你可以結合使用Object.keysreduceObject.assign功能,arrow functioncomputed property name爲一個非常簡單的單一語句解決方案。

const foo = { a: 1, b: 2, c: 3 }; 
const bar = Object.keys(foo) 
    .reduce((obj, key) => Object.assign({}, obj, { [foo[key]]: key }), {}); 

如果您使用的object spread operator(第3階段寫這篇文章),這將簡化事情有點進一步transpiling。

const foo = { a: 1, b: 2, c: 3 }; 
const bar = Object.keys(foo) 
    .reduce((obj, key) => ({ ...obj, [foo[key]]: key }), {}); 

最後,如果你有Object.entries可用(第4階段爲撰寫本文時),你可以清理邏輯觸摸更(IMO)。

const foo = { a: 1, b: 2, c: 3 }; 
const bar = Object.entries(foo) 
    .reduce((obj, [key, value]) => ({ ...obj, [value]: key }), {}); 
+0

SyntaxError:/Users/markus/Entwicklung/IT1_Beleg/public/es6/vokabeltrainer.js:意外的令牌(53:45) 51 |如果(btoa){ 52 | entries = Object.entries(entries) > 53 | .reduce((obj,[key,value])=>({... obj,[value]:key}),{}); |^ – Superlokkus

+0

@Superlokkus我對錯誤輸出的最好解釋是,你沒有對對象擴展語法進行轉譯,截至今天,我不知道任何原生支持它的JavaScript引擎。 – joslarson

3

使用ES6:

const obj = { a: "aaa", b: "bbb", c: "ccc", d: "ddd" }; 
Object.assign({}, ...Object.entries(obj).map(([a,b]) => ({ [b]: a }))) 
1

使用Ramda

const swapKeysWithValues = (source) => 
    R.pipe(
    R.keys, 
    R.reduce((obj, k) => R.assoc(source[k], k, obj), {}) 
)(source); 
0

由於@joslarson的補充和@jPO答案:
沒有ES6需要,您可以使用Object.keysArray.reduceComma Operator

Object.keys(foo).reduce((obj, key) => (obj[foo[key]] = key, obj), {}); 

有些人可能會覺得它很醜陋,但它「有點」更快,因爲reduce不會在每個循環上傳播obj的所有屬性。