🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

759閲覧

多次元配列オブジェクトを一定のルールで横並びする方法はありますか

3dkoi

総合スコア14

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/03/15 11:48

多次元配列オブジェクトを一定のルールで横並びさせたいです。

map関数のループ中にCSSのpositionのtop, leftの値を取得して配列内の別の値をそのposition通りに、Vue.jsのfor文で出力したいのですが、topの値を思ったように取得できません。どなたか力をお貸しください。

やりたいこと

CSSのtopを合わせたい

完成イメージヅ図

現状

ループされるたびにtopを生成するため一定の間隔になっています。

現状

topとleftを生成するために配列オブジェクトをmap関数でループします。その時leftの値をmoment.jsを使用してもとめます。topは一回ループするたびに値を取得したいのですが、現状一定の値であるため、task_codeごとにtopを取得するためにはどうすればよいでしょうか。

以下,コードです。お粗末だと思いますが、お力をお貸しください。

javascript

1// data.js 2export default 3[ 4 [ // user_id:1 start 5 [ 6 { 7 input_time: 8, 8 user_id: 1, 9 task_code: "100", 10 daily_day: "2021-02-01" 11 }, 12 { 13 input_time: 8, 14 user_id: 1, 15 task_code: "100", 16 daily_day: "2021-02-02" 17 }, 18 { 19 input_time: 8, 20 user_id: 1, 21 task_code: "100", 22 daily_day: "2021-02-08" 23 } 24 ], 25 [ 26 { 27 input_time: 8, 28 user_id: 1, 29 task_code: "101", 30 daily_day: "2021-02-03" 31 } 32 ] 33 ],// user_id:1 end 34 [ // user_id:2 start 35 [ 36 { 37 input_time: 5, 38 user_id: 2, 39 task_code: "105", 40 daily_day: "2021-02-01" 41 }, 42 { 43 input_time: 8.5, 44 user_id: 2, 45 task_code: "105", 46 daily_day: "2021-02-02" 47 }, 48 ], 49 [ 50 { 51 input_time: 0.5, 52 user_id: 2, 53 task_code: "100", 54 daily_day: "2021-02-01" 55 }, 56 { 57 input_time: 3.5, 58 user_id: 2, 59 task_code: "100", 60 daily_day: "2021-02-04" 61 } 62 ], 63 [ 64 { 65 input_time: 1, 66 user_id: 2, 67 task_code: "103", 68 daily_day: "2021-02-01" 69 } 70 ] 71 ] 72]

javascript

1<template> 2 <div> 3 <div class="p_hello"> 4 <div v-for="(d, index) in fn" :key="`first-${index}`" class="first"> 5 <div v-for="(i, index) in d" :key="`seconde-${index}`" class="seconde"> 6 <div v-for="(j, index) in i" :key="`third-${index}`"> 7 <div class="third" :style="j.style" :class="inputColor(j.item.input_time)"> 8 {{j.item.input_time}} 9 </div> 10 </div> 11 </div> 12 </div> 13 </div> 14 </div> 15</template> 16 17<script> 18import moment from 'moment' 19import data from '../assets/api/data' 20// console.log('data', data) 21 22export default { 23 data () { 24 return { 25 data, 26 date: '2021-02-01', 27 size: 30 28 } 29 }, 30 computed : { 31 fn () { 32 const start = moment(this.date) 33 let top = 20 34 let style 35 return this.data.map(value => { 36 return value.map(value => { 37 return value.map(item => { 38 const from = moment(item.daily_day) 39 let diff = from.diff(start, 'days') 40 let left = diff * this.size 41 style = { 42 top: `${top}px`, 43 left: `${left}px`, 44 color: 'black' 45 } 46 top = top + 40 47 48 return { 49 style, 50 item 51 } 52 }) 53 }) 54 }) 55 } 56 }, 57 methods: { 58 inputColor(input) { 59 if (input > 7) { 60 return 'green' 61 } 62 if (input < 4) { 63 return 'red' 64 } 65 } 66 } 67} 68</script> 69 70 71<style> 72 .first { 73 position: relative; 74 display:flex; 75 } 76 .seconde { 77 position: relative; 78 display: flex; 79 80 background-color:azure; 81 82 } 83 84 .third { 85 position: absolute; 86 font-size: 20px; 87 } 88 .green { 89 background: rgb(153, 235, 210); 90 } 91 .red { 92 background: rgb(236, 81, 127); 93 } 94</style> 95 96 97

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

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

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

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

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

guest

回答1

0

ベストアンサー

解決案

3dkoiさんが実現されたいtask_codeごとにtop位置を合わせる方法は色々ありそうですが、3dkoiさんが現在実装されている方法に出来るだけ沿って実装してみます。

fn() のロジックを下記のようにすれば、添付したスクリーンショットのようにtopの位置を揃えることができます。

実行結果

Javascript

1fn () { 2 const start = moment(this.date) 3 let top = 20 4 let style 5 return this.data.map(value => { 6 return value.map((value) => { 7 const result = value.map(item => { 8 const from = moment(item.daily_day) 9 let diff = from.diff(start, 'days') 10 let left = diff * this.size 11 style = { 12 top: `${top}px`, 13 left: `${left}px`, 14 color: 'black' 15 } 16 return { 17 style, 18 item 19 } 20 }) 21 top = top + 40 22 return result 23 }) 24 }) 25}

解説

変わった部分は、value.mapの部分からです。
同じtask_code内のループでtop = top + 40を行ってしまうと、3dkoiさんのおっしゃる通りループするたびにtopの位置が変わってしまいます。
上記のコードは、この問題に対して「task_codeが切り替わる時にtopの位置を更新する」ことで、それを解決しています。
value.map()内で、同じtask_codeの位置をそれぞれ割り出した後、それをreturnする前にtopの位置を更新することで、同じtask_code内のtopの値が同じになるようにしています。

何か不明な点などあればお伝えください。
ご確認をよろしくお願いします!

投稿2021/03/15 14:14

編集2021/03/15 14:15
marasonPD

総合スコア170

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

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

3dkoi

2021/03/15 16:09

回答ありがとうございます。 3dkoiです。 topを更新するタイミングがずれておりました。 勉強になりました。 ありがとうございました。
3dkoi

2021/04/10 00:57

先日はご回答ありがとうございました。大変勉強になりました。 大変申し訳ないのですが、もう一つ質問があります。 この質問の続きのような実装なのですが、この配列オブジェクトをセレクトボックスでフィルタリングするとなった場合のtopの再計算の方法で悩んでおります。 新たに質問を投稿しております。 もし、ご興味があれば、ご教示おねがいしたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問