값 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;
}
당신이 사용할 수있는 _.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'] }
객체의 키를 가져온 다음 Array의 reduce 함수를 사용하여 각 키를 살펴보고 값을 키로 설정하고 키를 값으로 설정합니다.
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);
ES6 사용 :
const obj = { a: "aaa", b: "bbb", c: "ccc", d: "ddd" };
Object.assign({}, ...Object.entries(obj).map(([a,b]) => ({ [b]: a })))
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), {});
Some may find it ugly, but it's "kinda" quicker as the reduce
doesn't spread all the properties of the obj
on each loop.
Try
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));
Using Ramda:
const swapKeysWithValues =
R.pipe(
R.keys,
R.reduce((obj, k) => R.assoc(source[k], k, obj), {})
);
const result = swapKeysWithValues(source);
I believe it's better to do this task by using an npm module, like invert-kv
.
invert-kv: Invert the key/value of an object. Example: {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'}
With pure Ramda in a pure and point-free style:
const swapKeysAndValues = R.pipe(
R.toPairs,
R.map(R.reverse),
R.fromPairs,
);
Or, with a little more convoluted ES6 version, still pure functional:
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);
Here is a pure functional implementation of flipping keys
and values
in ES6:
TypeScript
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))
참고URL : https://stackoverflow.com/questions/23013573/swap-key-with-value-json
'program story' 카테고리의 다른 글
VSCode 기본 터미널 변경 (0) | 2020.10.04 |
---|---|
Laravel Eloquent groupBy () AND 또한 각 그룹의 개수를 반환합니다. (0) | 2020.10.04 |
최종 개체를 수정할 수있는 이유는 무엇입니까? (0) | 2020.10.04 |
406을받는 Spring JSON 요청 (허용되지 않음) (0) | 2020.10.04 |
AngularJS 앱의 다이제스트 사이클 성능을 어떻게 측정합니까? (0) | 2020.10.04 |