2017-05-16 5 views
0

두 매개 변수는 모두 개체 목록입니다. 둘 다 속성 Name을 포함합니다. 속성 Name이 같은 곳에 해당 속성 중 일부를 투영하고 싶습니다. 다음은 올바른 결과를 제공합니다. 그러나 누군가가 나를 통과하여 하나의 리팩토링을 도와 줄 수 있습니까?이 축소 및 맵 기능 연결 방법

export function fieldProjections(docTypeFields, recordFields) { 
    const recordsByName = recordFields.reduce(function (rec, field) { 
     rec[field.Name] = field; 
     return rec; 
    }, {}); 
    const fields = docTypeFields.map(dt => { 
     return { 
      'Name': dt.Name, 
      'RawValue': recordsByName[dt.Name].RawValue, 
      'Type': dt.DataType, 
      'Value': recordsByName[dt.Name].Value, 
      'Id': dt.DocumentTypeFieldID 
     }; 
    }); 
    return fields; 
} 
+2

* "하나 개의 통과에 리팩토링?"* - 왜? 현재 코드는 입력 배열 당 한 번만 지나치므로 그보다 작은 값을 트래버스 할 수있는 방법은 없습니다. 한 번에 모든 속성을 생성하기 위해 하나의 객체 리터럴을 사용했다면,'.map()'콜백을 정리할 수 있습니다. – nnnnnn

+0

이미 가지고있는 것보다 훨씬 좋아질 것은 없습니다. 하지만 해시/"연관 배열"대신 Map을 사용할 수 있습니다. –

+0

나는 하나의 순회가 잘못된 명칭이라고 생각한다. 나는 위의 것을 하나의 표현으로 수행하기를 원했습니다. – monkeyjumps

답변

0

let docTypeFields = [{Name: 'doc1', RawValue: '8', Type: 'large', Value: '3.50', Id: '1'},{Name: 'doc2', RawValue: '11', Type: 'medium', Value: '4.50', Id: '2'},{Name: 'doc3', RawValue: '81', Type: 'largish', Value: '3.60', Id: '3'},{Name: 'doc4', RawValue: '22', Type: 'small', Value: '2.50', Id: '4'}], 
 
    recordFields = [{Name: 'doc1', Field: 'field1'},{Name: 'doc2', Field: 'field2'},{Name: 'doc3', Field: 'field3'},{Name: 'doc4', Field: 'field4'}]; 
 

 
docTypeFields.forEach(doc => { 
 
    let siblingRecord = recordFields.find(record => record.Name === doc.Name); 
 
    if (siblingRecord) doc.Field = siblingRecord.Field; 
 
}); 
 

 
console.log(docTypeFields);

+3

OP의 코드보다 * 반복 * 반복됩니다. (그리고 그것은 입력 데이터를 변경합니다.) – nnnnnn

+0

그건 공평합니다. 한 번의 탐색에서이 코드를 원한다는 사실을 알지 못했지만 단순히 코드를 단순화하려고했습니다. 객체 변형에 관해서는, 각 문서를 속여서 새로운 배열에 저장하는 것은 간단합니다 (비록 내가 docTypeFields를 수정하고 있음을 강조 했어야 만합니다). –