[javascript] 값 JSON으로 키 교체

다음과 같이 구조화 된 매우 큰 JSON 개체가 있습니다.

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

객체의 키로 값을 바꿀 수있는 함수가 필요하지만 어떻게해야할지 모르겠습니다. 다음과 같은 출력이 필요합니다.

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

내가 이것을 할 수있는 방법이 있습니까? 모든 것이 스왑되는 새 개체를 수동으로 만들 수 있습니까?
감사



답변

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;
  }, {});
}


답변

당신이 사용할 수있는 _.invert lodash 기능을 그것도 multivlaue을 사용할 수 있습니다

 var object = { 'a': 1, 'b': 2, 'c': 1 };

  _.invert(object);
  // => { '1': 'c', '2': 'b' }

  // with `multiValue`
  _.invert(object, true);
  // => { '1': ['a', 'c'], '2': ['b'] }


답변

ES6 사용 :

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


답변

객체의 키를 가져온 다음 Array의 reduce 함수를 사용하여 각 키를 살펴보고 값을 키로 설정하고 키를 값으로 설정합니다.

const data = {
  A: 1,
  B: 2,
  C: 3,
  D: 4
}
const newData = Object.keys(data).reduce(function(obj, key) {
  obj[data[key]] = key;
  return obj;
}, {});
console.log(newData);


답변

ES6 / ES2015에서 당신의 사용을 결합 할 수 있습니다 Object.keys감소 새로운와 Object.assign 기능, 화살표 기능계산 된 속성 이름 매우 간단 하나의 명령문 솔루션.

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 }), {});


답변

이제 Object.fromEntries가 있습니다.

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

또는

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


답변

@joslarson 및 @jPO 답변의 보완으로 :
ES6가 필요하지 않으면 및 쉼표 연산자를 사용할 수 있습니다 .Object.keys Array.reduce

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

일부는 추악하다고 생각할 수 있지만 각 루프 reduce의 모든 속성을 퍼 뜨리지 않기 때문에 더 빠릅니다 obj.