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

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

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

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

Q&A

解決済

2回答

3758閲覧

連想配列を複数のキーでグループ化したい

saru2021

総合スコア1

JavaScript

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

0グッド

1クリップ

投稿2021/10/02 09:22

前提・実現したいこと

緯度経度情報を持つ1000件ほどデータがあります。
下記のように緯度経度の下2桁を削除した上でグループ化したいのですが、思ったかたちにできません。
お力添えよろしくお願いいたします。

JavaScript

1 const data = [{ 2 jiscode: '20201', 3 name: '長野市', 4 ttl: 'タイトルA', 5 subttl:'サブタイトルA', 6 building: '長野市役所', 7 lat: '36.648631', 8 lng: '138.194287' 9 }, { 10 jiscode: '20201', 11 name: '長野市', 12 ttl: 'タイトルB', 13 subttl:'サブタイトルB', 14 building: '長野市役所', 15 lat: '36.648633', 16 lng: '138.194288' 17 }, { 18 jiscode: '20202', 19 name: '松本市', 20 ttl: 'タイトルC', 21 subttl:'サブタイトルC', 22 building: '松本市役所', 23 lat: '36.238096', 24 lng:'137.971992' 25 }, { 26 jiscode: '20203', 27 name: '上田市', 28 ttl: 'タイトルD', 29 subttl:'サブタイトルD', 30 building: '上田市役所', 31 lat:'36.401942', 32 lng:'138.249069' 33 }];

↓こうしたい

JavaScript

1 const groupByData = [{ 2 lat: '36.6486',//←下2桁削除 3 lng: '138.1942',//←下2桁削除 4 ttlLists: [{ 5 jiscode: '20201', 6 name: '長野市', 7 ttl: 'タイトルA', 8 subttl: 'サブタイトルA', 9 building: '長野市役所' 10 }, { 11 jiscode: '20201', 12 name: '長野市', 13 ttl: 'タイトルA', 14 subttl: 'サブタイトルA', 15 building: '長野市役所' 16 } 17 18 ] 19 }, 20 { 21 lat: '36.2380', 22 lng: '137.9719', 23 ttlLists: [{ 24 jiscode: '20202', 25 name: '松本市', 26 ttl: 'タイトルC', 27 subttl: 'サブタイトルC', 28 building: '松本市役所' 29 }] 30 }, 31 { 32 lat: '36.4019', 33 lng: '138.2490', 34 ttlLists: [{ 35 jiscode: '20203', 36 name: '上田市', 37 ttl: 'タイトルD', 38 subttl: 'サブタイトルD', 39 building: '上田市役所', 40 }] 41 } 42 ];

試したこと

下記の2つのサイト等を参考にして、グループ化はできましたが、その先がうまくいきません。
※サイトで紹介されている形にはできました。

https://zakkuri.life/%E3%80%90javascript-groupby%E3%80%91%E9%80%A3%E6%83%B3%E9%85%8D%E5%88%97%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%81%AB%E3%81%BE%E3%81%A8%E3%82%81%E3%82%8B/

https://hfuji.hatenablog.jp/entry/2017/06/25/222450

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

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

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

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

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

m.ts10806

2021/10/02 09:47

>下記の2つのサイト等を参考にして、グループ化はできましたが 現状できてるところまでのコードで良いので自身が書いたコードを提示してください。
guest

回答2

0

地道にやったらこんな感じでしょか。

javascript

1const data = [{ 2 jiscode: '20201', 3 name: '長野市', 4 ttl: 'タイトルA', 5 subttl:'サブタイトルA', 6 building: '長野市役所', 7 lat: '36.648631', 8 lng: '138.194287' 9 }, { 10 jiscode: '20201', 11 name: '長野市', 12 ttl: 'タイトルB', 13 subttl:'サブタイトルB', 14 building: '長野市役所', 15 lat: '36.648633', 16 lng: '138.194288' 17 }, { 18 jiscode: '20202', 19 name: '松本市', 20 ttl: 'タイトルC', 21 subttl:'サブタイトルC', 22 building: '松本市役所', 23 lat: '36.238096', 24 lng:'137.971992' 25 }, { 26 jiscode: '20203', 27 name: '上田市', 28 ttl: 'タイトルD', 29 subttl:'サブタイトルD', 30 building: '上田市役所', 31 lat:'36.401942', 32 lng:'138.249069' 33 }]; 34 35function mk1(d) { 36 const lat = d['lat'].slice(0,-2); 37 const lng = d['lng'].slice(0,-2); 38 return [lat + lng, {lat,lng,ttlLists:[]}]; 39} 40function mk2(d) { 41 return { 42 jiscode:d['jiscode'], 43 name:d['name'], 44 ttl:d['ttl'], 45 subttl:d['subttl'], 46 building:d['building'] 47 }; 48} 49let wk = []; 50for (let x of data) wk.push(mk2(x)); 51let ks = {}; 52for (let i in data) { 53 const [k,obj] = mk1(data[i]); 54 if (!(k in ks)) ks[k] = obj; 55 ks[k]['ttlLists'].push(wk[i]); 56} 57let groupByData = []; 58for (let m in ks) { 59 groupByData.push(ks[m]); 60} 61console.log(JSON.stringify(groupByData,null,2));

投稿2021/10/02 12:11

takasima20

総合スコア7460

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

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

saru2021

2021/10/02 14:05

ありがとうございます。 先にご回答頂いた方のやり方と両方試しましたが、やりたいことができました。 地道に、とのことでしたが、考え方が良く分かりました。
guest

0

ベストアンサー

そやの〜。ワテならlodash大先生にご活躍いただいて、こないにしてやっつけますわー。

javascript

1const key = ({ lat, lng }) => JSON.stringify({ 2 lat: lat.slice(0, -2), 3 lng: lng.slice(0, -2) 4}); 5 6const groupByData = _(data) 7 .groupBy(key) 8 .mapValues(v => v.map(e => _.omit(e, ['lat', 'lng']))) 9 .toPairs() 10 .map(([json, ttlLists]) => ({ ...JSON.parse(json), ttlLists })) 11 .value(); 12 13console.log(JSON.stringify(groupByData, null, 2));

サンプル

実行結果:

json

1[ 2 { 3 "lat": "36.6486", 4 "lng": "138.1942", 5 "ttlLists": [ 6 { 7 "jiscode": "20201", 8 "name": "長野市", 9 "ttl": "タイトルA", 10 "subttl": "サブタイトルA", 11 "building": "長野市役所" 12 }, 13 { 14 "jiscode": "20201", 15 "name": "長野市", 16 "ttl": "タイトルB", 17 "subttl": "サブタイトルB", 18 "building": "長野市役所" 19 } 20 ] 21 }, 22 { 23 "lat": "36.2380", 24 "lng": "137.9719", 25 "ttlLists": [ 26 { 27 "jiscode": "20202", 28 "name": "松本市", 29 "ttl": "タイトルC", 30 "subttl": "サブタイトルC", 31 "building": "松本市役所" 32 } 33 ] 34 }, 35 { 36 "lat": "36.4019", 37 "lng": "138.2490", 38 "ttlLists": [ 39 { 40 "jiscode": "20203", 41 "name": "上田市", 42 "ttl": "タイトルD", 43 "subttl": "サブタイトルD", 44 "building": "上田市役所" 45 } 46 ] 47 } 48] 49

投稿2021/10/02 10:12

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

saru2021

2021/10/02 14:01

ありがとうございます。 やりたいことができました。 lodashという便利なものを教えて頂いて助かりました。
退会済みユーザー

退会済みユーザー

2021/10/02 14:45

おおきに〜。lodash 覚えておくとなにかと便利やで。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問