web-dev-qa-db-fra.com

Échanger la clé avec la valeur JSON

J'ai un très gros objet JSON structuré comme ceci: 

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

J'ai besoin d'une fonction capable d'échanger les valeurs avec des clés dans mon objet et je ne sais pas comment le faire. J'aurais besoin d'une sortie comme celle-ci:

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

Existe-t-il un moyen de le faire qui créerait manuellement un nouvel objet où tout est échangé?
Merci

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

Exemple ici FIDDLE n'oubliez pas d'allumer votre console pour voir les résultats.

69
jPO

Obtenez les clés de l'objet, puis utilisez la fonction de réduction du tableau pour parcourir chaque clé et définir la valeur comme clé et la clé comme valeur.

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);
27
Patrick Evans

vous pouvez utiliser fonction lodash _.invert il peut aussi utiliser plusieurs sources

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

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

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

Dans ES6/ES2015, vous pouvez combiner l’utilisation de Object.keys et de reduction avec la nouvelle fonction Object.assign , une fonction arrow et un nom de propriété calculé pour une solution simple et simple.

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

Si vous transpilez en utilisant l'opérateur object spread (étape 3 à compter de l'écriture de ceci), cela simplifiera un peu les choses.

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

Enfin, si vous avez Object.entries disponible (étape 4 de l'écriture), vous pouvez nettoyer la logique un peu plus (IMO).

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

Utilisation de ES6:

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

Maintenant que nous avons Object.fromEntries:

obj => Object.fromEntries(Object.entries(obj).map(a => a.reverse()))

ou

obj => Object.fromEntries(Object.entries(obj).map(([k, v]) => ([v, k])))
5
Sc0ttyD

En complément des réponses @joslarson et @jPO:
Sans avoir besoin de ES6, vous pouvez utiliser Object.keysArray.reduce et l'opérateur de virgule :

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

Certains le trouveront peut-être moche, mais c'est "un peu" plus rapide car la reduce ne répand pas toutes les propriétés de la obj sur chaque boucle.

3
Vaidd4

Utiliser Ramda :

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

const result = swapKeysWithValues(source);
2
im.pankratov

Avec pure Ramda dans un style pur et sans point:

const swapKeysAndValues = R.pipe(
   R.toPairs,
   R.map(R.reverse),
   R.fromPairs,
);

Ou, avec une version ES6 un peu plus compliquée, toujours fonctionnelle:

const swapKeysAndValues2 = obj => Object
    .entries(obj)
    .reduce((newObj, [key, value]) => ({...newObj, [value]: key}), {})
1
Pietro Bellone
    var data = {A : 1, B : 2, C : 3, D : 4}
    var newData = {};
    Object.keys(data).forEach(function(key){newData[data[key]]=key});
    console.log(newData);
0
Anup Agarwal

Je pense qu'il est préférable de faire cette tâche en utilisant un module npm, tel que invert-kv.

invert-kv : Inverse la clé/la valeur d'un objet. Exemple: {foo: 'bar'} → {bar: 'foo'}

https://www.npmjs.com/package/invert-kv

const invertKv = require('invert-kv');

invertKv({foo: 'bar', Unicorn: 'Rainbow'});
//=> {bar: 'foo', Rainbow: 'Unicorn'}
0
Huan

Essayer 

let swap = (o,r={})=> Object.keys(o).map(x=>r[o[x]]=x)&&r;

let obj = {A : 1, B : 2, C : 3, D : 4};

let swap = (o,r={})=> Object.keys(o).map(x=>r[o[x]]=x)&&r;

console.log(swap(obj));

0
Kamil Kiełczewski