Переключить ключ со значением JSON
У меня очень большой объект JSON, структурированный следующим образом:
{A : 1, B : 2, C : 3, D : 4}
Мне нужна функция, которая может менять значения с помощью ключей в моем объекте, и я не знаю, как это сделать. Мне нужен вывод следующим образом:
{1 : A, 2 : B, 3 : C, 4 : D}
Есть ли способ, которым я могу это сделать, вручную создаст новый объект, где все будет заменено?
Благодаря
Ответы
Ответ 1
function swap(json){
var ret = {};
for(var key in json){
ret[json[key]] = key;
}
return ret;
}
Пример здесь FIDDLE Не забудьте включить консоль, чтобы увидеть результаты.
ES6 версии:
static objectFlip(obj) {
const ret = {};
Object.keys(obj).forEach(key => {
ret[obj[key]] = key;
});
return ret;
}
Или используя Array.reduce() & Object.keys()
static objectFlip(obj) {
return Object.keys(obj).reduce((ret, key) => {
ret[obj[key]] = key;
return ret;
}, {});
}
Или используя Array.reduce() & Object.entries()
static objectFlip(obj) {
return Object.entries(obj).reduce((ret, entry) => {
const [ key, value ] = entry;
ret[ value ] = key;
return ret;
}, {});
}
Ответ 2
вы можете использовать функцию lodash _.invert, он также может использовать многозначный
var object = { 'a': 1, 'b': 2, 'c': 1 };
_.invert(object);
// => { '1': 'c', '2': 'b' }
// with 'multiValue'
_.invert(object, true);
// => { '1': ['a', 'c'], '2': ['b'] }
Ответ 3
Получите ключи объекта, а затем используйте функцию уменьшения массива, чтобы пройти через каждую клавишу и установить значение в качестве ключа, а ключ - как значение.
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);
Ответ 4
Использование ES6:
const obj = { a: "aaa", b: "bbb", c: "ccc", d: "ddd" };
Object.assign({}, ...Object.entries(obj).map(([a,b]) => ({ [b]: a })))
Ответ 5
В ES6/ES2015 вы можете комбинировать использование Object.keys и reduce с новой функцией Object.assign, arrow function и вычисленное имя свойства для довольно простого решения одной инструкции.
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 }), {});
Ответ 6
Теперь, когда у нас есть Object.fromEntries:
obj => Object.fromEntries(Object.entries(obj).map(a => a.reverse()))
или же
obj => Object.fromEntries(Object.entries(obj).map(([k, v]) => ([v, k])))
Ответ 7
В дополнение к комментариям @joslarson и @jPO:
Без ES6 вы можете использовать Object.keys
Array.reduce
и Comma Operator:
Object.keys(foo).reduce((obj, key) => (obj[foo[key]] = key, obj), {});
Некоторые из них могут оказаться уродливыми, но это "скорее" быстрее, чем reduce
не распространяет все свойства obj
на каждый цикл.
Ответ 8
Пытаться
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));
Ответ 9
Используя Рамду:
const swapKeysWithValues =
R.pipe(
R.keys,
R.reduce((obj, k) => R.assoc(source[k], k, obj), {})
);
const result = swapKeysWithValues(source);
Ответ 10
Я считаю, что лучше сделать эту задачу с помощью модуля npm, например, invert-kv
.
invert-kv: инвертировать ключ/значение объекта. Пример: {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'}
Ответ 11
С чистой Рамдой в чистом стиле без очков:
const swapKeysAndValues = R.pipe(
R.toPairs,
R.map(R.reverse),
R.fromPairs,
);
Или, с немного более замысловатой версией ES6, все еще чистый функционал:
const swapKeysAndValues2 = obj => Object
.entries(obj)
.reduce((newObj, [key, value]) => ({...newObj, [value]: key}), {})
Ответ 12
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);
Ответ 13
Вот чисто функциональная реализация переключения keys
и values
в ES6:
машинопись
const flipKeyValues = (originalObj: {[key: string]: string}): {[key: string]: string} => {
if(typeof originalObj === "object" && originalObj !== null ) {
return Object
.entries(originalObj)
.reduce((
acc: {[key: string]: string},
[key, value]: [string, string],
) => {
acc[value] = key
return acc;
}, {})
} else {
return {};
}
}
JavaScript
const flipKeyValues = (originalObj) => {
if(typeof originalObj === "object" && originalObj !== null ) {
return Object
.entries(originalObj)
.reduce((acc, [key, value]) => {
acc[value] = key
return acc;
}, {})
} else {
return {};
}
}
const obj = {foo: 'bar'}
console.log("ORIGINAL: ", obj)
console.log("FLIPPED: ", flipKeyValues(obj))