2017-05-16 6 views
0

これらのパラメータはどちらもオブジェクトのリストです。どちらもプロパティNameを含んでいます。プロパティNameが等しい場所のプロパティをいくつか投影したいと思います。以下は正しい結果を示しています。しかし、誰かがそれを1つのトラバーサルにリファクタリングする手助けをすることができますか?このreduceとmap関数の連鎖方法

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

* "1つのトラバーサルにそれをリファクタリング?" * - なぜ?現在のコードは、入力配列ごとに1回しか移動しないので、どのようにしてそれを追跡するのか分かりません。さて、すべてのプロパティを一度に作成するために単一のオブジェクトリテラルを使用した場合、 '.map()'コールバックは整理される可能性があります。 – nnnnnn

+0

あなたがすでに持っているものよりずっと良くなることはありません。しかし、ハッシュ/ "連想配列"の代わりにMapを使うことができます。 –

+0

私は1つのトラバースが誤称であったとします。私は上記を単一の式で実行したかったのです。 – 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

それは公正です。私は彼が1つのトラバースでそれを望んでいたことに気付かず、単純にコードを単純化しようとしていました。オブジェクトの突然変異に関しては、各ドックを捨てて新しい配列に格納するのは簡単です(しかし、私はdocTypeFieldsを修正していたはずです)。 –

関連する問題