交换键值JSON

我有一个非常大的JSON对象,如下所示:

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

我需要一个函数,可以用我的对象中的键交换值,我不知道该怎么做。 我需要这样的输出:

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

有什么办法,我可以做到这一点手动创build一个新的对象,一切都交换?
谢谢

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

这里的例子FIDDLE不要忘记打开你的控制台来查看结果。

获取对象的键,然后使用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); 

你可以使用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'] } 

在ES6 / ES2015中,您可以结合使用Object.keys,并使用新的Object.assign函数, 箭头函数和计算出的属性名称来简化单个语句解决scheme。

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

如果你正在使用对象扩展运算符进行转译(第3阶段),这将进一步简化。

 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 }), {}); 

使用ES6:

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

使用Ramda :

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