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
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.
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);
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'] }
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 }), {});
Utilisation de ES6:
const obj = { a: "aaa", b: "bbb", c: "ccc", d: "ddd" };
Object.assign({}, ...Object.entries(obj).map(([a,b]) => ({ [b]: a })))
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])))
En complément des réponses @joslarson et @jPO:
Sans avoir besoin de ES6, vous pouvez utiliser Object.keys
Array.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.
Utiliser Ramda :
const swapKeysWithValues =
R.pipe(
R.keys,
R.reduce((obj, k) => R.assoc(source[k], k, obj), {})
);
const result = swapKeysWithValues(source);
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}), {})
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);
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'}
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));