javascriptで2つの配列を後の配列優先でマージする方法を教えてください
javascriptで2つの連想配列のマージを効率良く実行する方法を教えて下さい。
から、2つの配列をマージをする方法で、順番を考える必要がでてきたのですがが、
後の配列のorderで、前の配列のorderを再構築をしたいと考えています。
(前提条件)
draggedRowData <= tempRowData
わかるかたいらっしゃいましたら、ご教授お願いします。
下記のソースは2つの配列をマージしているのですが、tempRowData優先になっています。
その理由は draggedRowData.find((e) => e.id === currentValue.id); を使っているから、tempRowDataの順番でdraggedRowDataを取得してしまうところまでわかっているのですが。
javascript
1let tempRowData = [ 2 {id: 1, text: "TEST1", order: 1, isDeleted: false}, 3 {id: 2, text: "TEST2", order: 2, isDeleted: false}, 4 {id: 3, text: "TEST3", order: 3, isDeleted: true} 5]; 6 7let draggedRowData = [ 8 {id: 1, text: "TEST1", order: 2, isDeleted: false}, 9 {id: 2, text: "TEST4", order: 1, isDeleted: false} 10]; 11 12const mergedRowData = tempRowData.reduce((accumulator, currentValue) => { 13 let rData = draggedRowData.find((r) => r.id === currentValue.id ); 14 15 if (rData) { 16 rData.order = index + 1; 17 accumulator.push(rData); 18 } else { 19 currentValue.order = index + 1; 20 accumulator.push(currentValue); 21 } 22 23 return accumulator; 24}, []); 25 26 27tempRowData = mergedRowData; 28console.log(tempRowData); 29 30/* 31現在 32[ 33 { id: 1, text: 'TEST1', order: 1, isDeleted: false }, 34 { id: 2, text: 'TEST2', order: 2, isDeleted: false }, 35 { id: 3, text: 'TEST3', order: 3, isDeleted: true } 36] 37 38取得したいデータ 39[ 40 { id: 2, text: 'TEST4', order: 1, isDeleted: false }, 41 { id: 1, text: 'TEST1', order: 2, isDeleted: false }, 42 { id: 3, text: 'TEST3', order: 3, isDeleted: true } 43] 44*/
追記
先にdraggedRowDataの順番とorderを入れ替えした。
reduceを修正して、reduce処理後に、sort、再連番して、期待する結果になりました、少し冗長になってしまったかもしれません。
もう少し効率の良いやりかたがあれば。
javascript
1// 先にdraggedRowDataの順番とorderを入れ替えした。サンプルのため直接配列を書いてます。 2let draggedRowData = [ 3 {id: 2, text: "TEST4", order: 1, isDeleted: false} 4 {id: 1, text: "TEST1", order: 2, isDeleted: false}, 5]; 6 7let mergedRowData = tempRowData.reduce((accumulator, currentValue) => { 8 let rData = draggedRowData.find((e) => e.id === currentValue.id); 9 accumulator.push(rData ? rData : currentValue); 10 return accumulator; 11}, []); 12 13// orderでソート 14mergedRowData.sort((a, b) => { 15 return a.order - b.order; 16}); 17 18// 再連番 19mergedRowData.forEach((currentValue, index) => { 20 currentValue.order = index + 1; 21}); 22 23tempRowData = mergedRowData; 24console.log(tempRowData); 25 26/* 27結果 28[ 29 { id: 2, text: 'TEST4', order: 1, isDeleted: false }, 30 { id: 1, text: 'TEST1', order: 2, isDeleted: false }, 31 { id: 3, text: 'TEST3', order: 3, isDeleted: true } 32] 33*/
回答1件
あなたの回答
tips
プレビュー