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

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

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

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

2回答

414閲覧

2つの配列の要素を比較し、新しい配列を作成したいです

bb33laxhouse

総合スコア1

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

0クリップ

投稿2021/09/04 13:58

前提・実現したいこと

・配列①:二次元配列
・配列②:オブジェクトの配列
を組み合わせて、最終的に配列③を作りたいです。

配列③は下記の加工をしたものです。
・配列①にない「長野」を削除
・配列①にある「埼玉」を追加(
)「県庁所在地」は仮の値として0を代入しておく(スプレッドシートに出力後に直接入力)。

オブジェクト内の要素を比較し、追加・削除する方法がわからず、伺いたいです!

該当のソースコード

GAS

1//参照する配列① 2const area = [ 3 ['神奈川'], 4 ['埼玉'],//配列②に追加したい 5 ['兵庫'] 6]; 7 8//元の配列② 9const data = [ 10 {'地域':'神奈川','No.':1}, 11 {'地域':'長野','No.':2},//配列②から削除したい要素 12 {'地域':'兵庫','No.':3}, 13]; 14 15//作りたい配列③ 16const newData = [ 17 {'地域':'神奈川','No.':1}, 18 {'地域':'埼玉','No.':0},//新規追加した要素 19 {'地域':'兵庫','No.':3} 20 //長野のデータは削除 21]

試したこと

indexOfなどでできるかと思いましたがうまくいかず、、

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

guest

回答2

0

js

1const res = area.map( o=>{ 2 const i = data.find( v=> v[ '地域' ] === o[ 0 ] ) || {'No.':0}; 3 return {'地域': o[ 0 ],'No.': i[ 'No.' ] }; 4} ); 5```**動くサンプル:**[https://jsfiddle.net/hdyxm1L4/](https://jsfiddle.net/hdyxm1L4/) 6 7--- 8 9【Array.prototype.map() - JavaScript | MDN10[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map) 11 12【Array.prototype.find() - JavaScript | MDN13[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/find](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/find)

投稿2021/09/04 14:17

kei344

総合スコア69606

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

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

bb33laxhouse

2021/09/04 17:06 編集

ご回答ありがとうございます!!! こちらのコードでも無事解決することができました! 解説ページも添付いただき、とても助かります。 コードだけではどんな機能をしているか分からなかったのですが、参考にして勉強します! 夜分にありがとうございました????‍♂️
guest

0

ベストアンサー

最初から、2つの操作

(1) 元の配列② data から、地域が参照する配列① area にない要素を削除した配列を作る。

(2) 参照する配列① area にあり、元の配列②data には存在しない地域の要素を、dataの末尾に追加する。No.は0で初期化

をいっぺんにやろうとするとワケわかんなくなるやん。そやからまずは個別に考えるとええのとちゃいます? ゆうことで、まずは

(1) 元の配列② data から、地域が参照する配列① area にない要素を削除した配列を作る。

のほうやけど、この操作によって出来る配列を data1 とすると、

GAS

1// data から、地域が area にない要素を削除した配列 data1 を作る。 2const data1 = data.filter(e => area.find(([a]) => a === e['地域']));

でいけます。次に

(2) 参照する配列① area にあり、元の配列②data には存在しない地域の要素を、dataの末尾に追加する。No.は0で初期化

のほうは、この操作によって出来る配列を data2 とすると、

GAS

1// area にあり、data には存在しない地域の要素を、dataの末尾に追加する。No.は0で初期化 2const data2 = area.reduce((arr, [a]) => 3 arr.find(e => a === e['地域']) ? arr : [...arr, { '地域': a, 'No.': 0 }] 4 , data);

で出来ます。

ということは、質問のnewData を作るには、(2)の操作を、元の配列②data に対してではなく、(1)で出来る配列 data1 に対して行えばよいので

GAS

1const data1 = data.filter(e => area.find(([a]) => a === e['地域'])); 2 3const newData = area.reduce((arr, [a]) => 4 arr.find(e => a === e['地域']) ? arr : [...arr, { '地域': a, 'No.': 0 }] 5 , data1);

とすればよいです。そして、途中の変数 data1 を無くして詰めれば

GAS

1const newData = area.reduce((arr, [a]) => 2 arr.find(e => a === e['地域']) ? arr : [...arr, { '地域': a, 'No.': 0 }] 3 , data.filter(e => area.find(([a]) => a === e['地域'])));

となります。実行例はこないな感じや。

イメージ説明

とはいえ、data1 無くして詰めると読みにくくなるので、data1無くす前のほうでもええかと思いますわ。

投稿2021/09/04 15:51

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

bb33laxhouse

2021/09/04 17:03

ご丁寧にありがとうございます!!!!! 無事解決することができました。20行以上の汚いコードを書いてはエラーを出していたので、本当に助かりました。。。 ご説明もとてもわかりやすいです。 正直、コードの内容に関しては現時点では分からない(そもそも知らない)ものが多いのですが、その点については自分で調べてスキルとして身につけようと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問