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
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.
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);
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'] }
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 }), {});
Mit ES6:
const obj = { a: "aaa", b: "bbb", c: "ccc", d: "ddd" };
Object.assign({}, ...Object.entries(obj).map(([a,b]) => ({ [b]: a })))
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])))
Als Ergänzung zu den Antworten von @joslarson und @jPO:
Ohne ES6 können Sie Object.keys
Array.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.
Verwenden von Ramda :
const swapKeysWithValues =
R.pipe(
R.keys,
R.reduce((obj, k) => R.assoc(source[k], k, obj), {})
);
const result = swapKeysWithValues(source);
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}), {})
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);
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'}
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));