Подтвердить что ты не робот

Переключить ключ со значением JSON

У меня очень большой объект JSON, структурированный следующим образом:

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

Мне нужна функция, которая может менять значения с помощью ключей в моем объекте, и я не знаю, как это сделать. Мне нужен вывод следующим образом:

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

Есть ли способ, которым я могу это сделать, вручную создаст новый объект, где все будет заменено?
Благодаря

4b9b3361

Ответ 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))