交换键值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);