it-swarm.com.de

Tauschen Sie den Schlüssel mit dem Wert JSON

Ich habe ein extrem großes JSON-Objekt, das folgendermaßen strukturiert ist: 

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

Ich brauche eine Funktion, die die Werte mit den Schlüsseln in meinem Objekt austauschen kann, und ich weiß nicht, wie das geht. Ich würde eine Ausgabe wie diese benötigen:

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

Gibt es eine Möglichkeit, auf diese Weise manuell ein neues Objekt zu erstellen, bei dem alles ausgetauscht wird?
Vielen Dank

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

Beispiel hier FIDDLE Vergessen Sie nicht, Ihre Konsole einzuschalten, um die Ergebnisse anzuzeigen.

69
jPO

Rufen Sie die Schlüssel des Objekts ab, und verwenden Sie dann die Reduzierfunktion des Arrays, um jeden Schlüssel durchzugehen und den Wert als Schlüssel und den Schlüssel als Wert festzulegen.

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

sie können die lodash-Funktion _.invert verwenden es kann auch Multivlaue verwenden

 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

In ES6/ES2015 können Sie die Verwendung von Object.keys und verkleinern mit der neuen Funktion Object.assign , einer arrow-Funktion und einem berechneten Eigenschaftennamen für eine ziemlich unkomplizierte Lösung mit einer einzelnen Anweisung.

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

Wenn Sie mit dem object-Spread-Operator (ab Stufe 3) umwandeln, wird dies die Sache ein wenig vereinfachen.

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

Wenn Sie Object.entries zur Verfügung haben (Stufe 4 zum Zeitpunkt des Schreibens), können Sie die Logik ein wenig bereinigen (IMO).

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

Mit ES6:

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

Jetzt haben wir Object.fromEntries:

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

oder

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

Als Ergänzung zu den Antworten von @joslarson und @jPO:
Ohne ES6 können Sie Object.keysArray.reduce und den Comma Operator verwenden:

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

Einige finden es hässlich, aber es ist "irgendwie" schneller, da die Variable reduce nicht alle Eigenschaften der Variable obj in jeder Schleife ausbreitet.

3
Vaidd4

Verwenden von Ramda :

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

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

Mit reinem Ramda in einem reinen und punktfreien Stil:

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

Oder, mit einer etwas gewundeneren ES6-Version, immer noch rein funktional:

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

Ich glaube, es ist besser, diese Aufgabe mit einem npm-Modul wie invert-kv zu erledigen.

invert-kv : Invertiert den Schlüssel/Wert eines Objekts. Beispiel: {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

Versuchen 

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