0

API에서 반환 된 일부 데이터를 정규화하려고합니다. 이미 프로젝트에서 밑줄을 사용하고 있습니다.개체 배열 및 키로 ID를

var normalisedRes = [{ 
    1: { 
    badge_no: 123, 
    id: 1, 
    name: 'bob' 
    } 
}, { 
    2: { 
    badge_no: 456, 
    id: 2, 
    name: 'bill' 
    } 
}, { 
    3: { 
    badge_no: 789, 
    id: 3, 
    name: 'ben' 
    } 
}]; 

내가 OBJ 내에서 ID를 유지하는 것이 중요하다

var res = [{ 
    badge_no: 123, 
    id: 1, 
    name: 'bob' 
    }, { 
    badge_no: 456, 
    id: 2, 
    name: 'bill' 
    }, { 
    badge_no: 789, 
    id: 3, 
    name: 'ben' 
    }, 
    // etc 
]; 

나는과 같은 데이터 구조를 만들 찾고 있어요. 나는 이것을 reduce와 함께 할 수 있다고 믿지만, 나는 고심하고있다.

도움 주셔서 감사합니다.

편집 :이 질문은 이제 답변되었습니다. 내가 원래 생각 나는 예상대로

{ '1': {data}, '2':{data}, '3':{data} } 

, 나는 줄이고 사용이 작업을 수행하려면 : 여기에 조언의 일부에서

, 나는처럼 보이는 OBJ를 반환하는 데이터를 정상화하기로 결정했습니다

var normalised = res.reduce((acc, person) => { acc[person.id] = person; return acc; }, {});

모든 답변을 제공해 주셔서 다시 한 번 감사드립니다. 당신은 또한 작업을 완수해야 reduce()하지만 map()을 사용할 수 원하는 경우

+1

지금까지 시도한 코드를 공유 할 수 있습니까? – Rajesh

+4

그래서 객체 배열을 원한다면, 각각의 객체는 하나의 키 ('id')를 포함하고 있습니까? 그게 당신이 시작한 것의 "더 나은"또는 정규화 된 버전입니까? 왜 그 구조를 원하니? –

+3

최종 구조가 적합하지 않습니다. 왜 하나의 객체를 래핑하기 위해 배열이 필요합니까? – charlietfl

답변

1

당신은 Array#map()

var res = [{badge_no:123, id:1, name:'bob'},{badge_no:456, id:2, name:'bill'},{badge_no:789, id:3, name:'ben'}]; 
 

 
var result = res.map(e => ({[e.id]: e})) 
 
console.log(result)

이 작업을 수행 할 수 있습니다.

var res = [{badge_no:123, id:1, name:'bob'},{badge_no:456, id:2, name:'bill'},{badge_no:789, id:3, name:'ben'}]; 
 

 
var result = res.reduce((r, e) => (r.push({[e.id]: e}), r), []) 
 
console.log(result)

+0

정답이지만 OP가 노력을 공유 할 때까지 기다리지 않아야합니까? – Rajesh

1

당신은 객체 Array#map를 사용하고 id와 키를 설정하고 개체를 반환 할 수있다.

var array = [{ badge_no: 123, id: 1, name: 'bob' }, { badge_no: 456, id: 2, name: 'bill' }, { badge_no: 789, id: 3, name: 'ben' }], 
 
    result = array.map(function (a) { 
 
     var o = {}; 
 
     o[a.id] = a; 
 
     return o; 
 
    }); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
ES6와

, 당신은 계산 된 속성을 사용할 수 있습니다. 객체의 키와

var array = [{ badge_no: 123, id: 1, name: 'bob' }, { badge_no: 456, id: 2, name: 'bill' }, { badge_no: 789, id: 3, name: 'ben' }], 
 
    result = array.map(a => ({ [a.id]: a })); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+1

정답이지만 OP가 노력을 공유 할 때까지 기다리지 않아야합니까? – Rajesh

+0

링크가 잘못되었다고 생각합니다 ... [Map] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map)이 아니며, ['Array .prototype.map'] (https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Array/map) – NonPolynomial

+0

@ NonPolynomial, 맞습니다. 그것은 잘못된 참조였습니다. –

1

당신 캔트 사용하는 정수. 그래서 당신의 예제는 불가능합니다. 관련 이슈보기 : Javascript: Using integer as key in associative array?

+3

어떤 유형의 키라도 사용할 수 있습니다. 단지 문자열에 자동 저장됩니다. – NonPolynomial

+3

예를 들어 문자열을 사용하여 객체 내부의 속성에 액세스해야하므로 일반적으로 나쁜 습관입니다. console.log (normalisedRes [ "3"]) 대신 console.log (normalisedRes.3)와 같은 작업을 수행하면 오류가 발생합니다. –

+3

'normalisedRes [3]'도 역시 정상적으로 작동하고 키가 계산되는 자동화 된 프로세스에서는 대괄호 구문 – NonPolynomial