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

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

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

GraphQL は、アプリケーション・プログラミング・インタフェース (API) 向けのクエリ言語およびサーバーサイドランタイムです。APIの速度、柔軟性、開発者にとっての使いやすさを向上させるために設計され、データを複数のデータソースから取得するリクエストを1つのAPI呼び出しで構成できます。

Gatsby

Gatsbyとは、Reactベースの静的サイトジェネレータ。最新のフロントエンド技術を活かし、機能豊富なWebサイトやアプリケーションを作ることが可能です。GraphQLを用いてあらゆるソースからサイトのデータを取得。指定した設定に基づいて静的サイトを構築することができます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1355閲覧

Gatsby.jsでAPIから取得した一部のデータを[key,value]の連想配列にしたい

ninmi01

総合スコア1

GraphQL

GraphQL は、アプリケーション・プログラミング・インタフェース (API) 向けのクエリ言語およびサーバーサイドランタイムです。APIの速度、柔軟性、開発者にとっての使いやすさを向上させるために設計され、データを複数のデータソースから取得するリクエストを1つのAPI呼び出しで構成できます。

Gatsby

Gatsbyとは、Reactベースの静的サイトジェネレータ。最新のフロントエンド技術を活かし、機能豊富なWebサイトやアプリケーションを作ることが可能です。GraphQLを用いてあらゆるソースからサイトのデータを取得。指定した設定に基づいて静的サイトを構築することができます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/08/23 07:44

Gatsby.jsでGitHubAPIからリポジトリのデータを取得したデータから、
プログラム言語の名前と名前ごとのサイズを[key,value]の連想配列にしたいのですがどうすればできますか?

query ($number_of_repos: Int!) { viewer { name avatarUrl isHireable resourcePath repositories(last: $number_of_repos, privacy: PUBLIC, orderBy: { field: STARGAZERS, direction:ASC } ) { nodes { name description homepageUrl forkCount createdAt updatedAt resourcePath languages(last: 9, orderBy: { field: SIZE, direction:ASC } ) { totalSize totalCount edges { size node { name color } } } stargazers { totalCount } } } } }

このGraphQLのクエリからlanguagesのsizeとnameを配列のデータにしたいです。
ソースファイルはhttps://github.com/yumi9502/githubStart1よろしくお願いします。

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

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

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

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

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

guest

回答1

0

自己解決

この方法が最善ではないかもしれませんが自己解決しました。

はじめにGitHubのAPIのデータを取得するためuseStaticQueryを使いました。
まずはreact@^16.8.0とreact-dom@^16.8.0をターミナルでインストールします。

yarn add react@^16.8.0 react-dom@^16.8.0

そして次のコードでプログラム言語のデータを目的の連想配列にすることができました。

jsx

1import React from "react" 2import {useStaticQuery,graphql} from "gatsby" 3import {Doughnut} from "react-chartjs-2" 4 5const LangData=()=>{ 6 const tempData= useStaticQuery(graphql` 7 query GitData{ 8 githubData { 9 data{ 10 viewer { 11 name 12 avatarUrl 13 isHireable 14 resourcePath 15 repositories { 16 totalCount 17 nodes { 18 name 19 description 20 homepageUrl 21 forkCount 22 createdAt 23 updatedAt 24 resourcePath 25 languages { 26 totalSize 27 totalCount 28 edges { 29 size 30 node { 31 name 32 color 33 } 34 } 35 } 36 stargazers { 37 totalCount 38 } 39 } 40 } 41 } 42 } 43 } 44 } 45 `) 46 // リポジトリのtotalCountを取得してリポジトリごとの言語の名前とバイト数を取得する 47const totalRepo=tempData.githubData.data.viewer.repositories.totalCount 48const langName1=[] 49const langSize1=[] 50for(let i=0;i<totalRepo;i++){ 51 let langEachRepo=tempData.githubData.data.viewer.repositories.nodes[i].languages.totalCount 52 for(let j=0;j<langEachRepo;j++){ 53 langName1.push(tempData.githubData.data.viewer.repositories.nodes[i].languages.edges[j].node.name) 54 langSize1.push(tempData.githubData.data.viewer.repositories.nodes[i].languages.edges[j].size) 55 } 56} 57 58// 言語の名前とバイト数を[key,value]からなる配列にする 59var langSet = []; 60for(var i=0;i<langSize1.length;i++){ 61 langSet.push([langName1[i],langSize1[i]]); 62} 63 64// 言語の名前ごとの合計を出す 65var sum={}; // 連想配列 66for(var i=0;i<langSet.length;i++){ 67 var key=langSet[i][0]; // i++されるたび変数keyにlangSet[i]のキーを入れる 68 if(key in sum){ // sumのキーに変数keyと同じキーが存在するかチェック 69 sum[key]+=langSet[i][1]; // 存在するときは同じキーごとにlangSet[i]の値を足す 70 }else{ 71 sum[key]=langSet[i][1]; //存在しないときはキーに値を入れる 72 } 73} 74 75delete sum['Mask'] 76delete sum['HLSL'] 77delete sum['Mathematica'] 78delete sum['ShaderLab'] 79 80const label1=[]; 81const data1=[]; 82for(var key in sum){ 83 label1.push(key); 84 data1.push(sum[key]) 85} 86 const data={ 87 labels:label1, 88 datasets:[{ 89 backgroundColor:["#178600","#2B7489","#e34c26","#563D7C","#f1e05a"], 90 data:data1, 91 },], 92 }; 93return( 94 <Doughnut data={data} /> 95) 96} 97export default LangData

JavaScriptやフレームワークを始めたばかりでまだ改善できるかもしれないですが今後に活かすようにしていきたいです。

投稿2020/08/26 08:06

ninmi01

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問