質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

970閲覧

javascriptで2つの配列を後の配列優先でマージする方法を教えてください

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/07/09 11:14

編集2021/07/09 12:42

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*/

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2021/07/09 13:06

TEST2 が消えていますが、それで問題ないんでしょうか?
退会済みユーザー

退会済みユーザー

2021/07/10 04:37

コメントありがとうございます。 TEST2は上書きしてTEST4になります。
guest

回答1

0

ベストアンサー

追記に関して、もっと簡潔に書きたいなら、

mapを使って

javascript

1const mergedData = tempRowData.map(oldData => { 2 const newData = draggedRowData.find(({ id }) => oldData.id === id) 3 return newData ?? oldData 4}).sort((current, next) => current.order > next.order ? 1 : -1)

読みにくいですが、returnを省略して一行で書きたいなら

javascript

1const mergedData = tempRowData.map(oldData => draggedRowData.find(({ id }) => oldData.id === id) ?? oldData).sort((current, next) => current.order - next.order)

reduceが使いたいなら

javascript

1const mergedData = tempRowData.reduce((accumulator, currentValue) => { 2 const newData = draggedRowData.find(({ id }) => currentValue.id === id) 3 return [...accumulator, newData ?? currentValue] 4}, []).sort((current, next) => current.order > next.order ? 1 : -1)

同じ要領で一行で書きたいなら

javascript

1const mergedData = tempRowData.reduce((accumulator, currentValue) => [...accumulator, draggedRowData.find(({ id }) => currentValue.id === id) ?? currentValue], []).sort((current, next) => (current.order - next.order))

のような感じになるかと思います。

投稿2021/07/09 12:57

編集2021/07/09 14:23
taku-hu

総合スコア176

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/07/10 04:44 編集

コメントありがとうございます。 なるほど、そんな書き方があるんですね。 元の配列とサイズは変えないですし、reduceよりmapのほうがシンプルな感じはしますね! 例もnewDataとoldDataに分けて書いてあるのでとてもわかりやすかったです mapのreturnを省略しないほうのやり方でやりたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問