Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Vue.Jsのテーブルのループを列→行に組み替えたい

解決したいこと

Vue.Jsのテーブルのループを列→行に組み替えたい

前回の質問で無事にデータを画面に出すところまではできました。
https://qiita.com/hagetaka/questions/384479692a3e2a669df9

しかしながらテーブルの行列を入れ替えて、レンダリング出力したいと考えています。

現状

現状は下記のように表示できています。
無題.png

これを下記のようにしたいです。
無題2.png

問題

v-forでループを組む際に、<tr> → <td> で入れ子に回していますが、
これを<td> → <tr> の順にすれば、表の縦横を入れ替えることが出来ないでしょうか?

あとjsonデータ中のkey自体も、<th>のようにヘッダで入れたいと考えています。

これらの仕様はすべて、与えたJSONデータによって、動的に変わるようにしたいと考えています。

keyの並びが勝手にアルファベット順番になってしまうのも、何とかしたいです(これはJSONの性質でしょうか?)
これは解決しました https://stackoverrun.com/ja/q/11896258

CSSで入れ替える案がありました。最悪のときはこれを採用しますが、script側で処理したところです。
https://qiita.com/niyute/items/5f1971013117c5e475fc

flaskからのリストを、二次元配列にして転置し、これをJAVASCRIPT側で処理するのが良さそうな気がしています。

該当するソースコード

Flask側から与えているデータは下記です。

@app.route('/setdata/<question_id>')
def setdata(question_id):
    mapios = get_mapios_data(question_id)
    result = get_mapios_data("test")
    items = [mapios[0],result[0]]
    return render_template(        'index.html',        items = items,  patent_number = question_id)
(Pdb) items
[{'patent_number': 'data', 'BIJ': 'a', 'IPC': 'b', 'FT': 'c', 'ABJ': 'd', 'CLJ': 'e', 
'DEJ': 'f', 'FIELD': 'g', 'BACKGROUND': 'h', 'SUBJECT': 'i', 'MEANS': 'j', 'OPERATION': 'k', 
'EFFECT': 'l', 'EDJ': 'm', 'DRJ': 'n'},
 {'patent_number': 'test', 'BIJ': 'a', 'IPC': 'b', 'FT': 'c', 'ABJ': 'd', 'CLJ': 'e', 'DEJ': 'f',
 'FIELD': 'g', 'BACKGROUND': 'h', 'SUBJECT': 'i', 'MEANS': 'j', 'OPERATION': 'k', 'EFFECT': 'l', 
'EDJ': 'm', 'DRJ': 'n'}]

Js側で受けたデータは下記です。

items=[
{"ABJ":"d","BACKGROUND":"h","BIJ":"a","CLJ":"e","DEJ":"f","DRJ":"n","EDJ":"m",
"EFFECT":"l","FIELD":"g","FT":"c","IPC":"b","MEANS":"j","OPERATION":"k",
"SUBJECT":"i","patent_number":"data"},{"ABJ":"d","BACKGROUND":"h","BIJ":"a","CLJ":"e","DEJ":"f","DRJ":"n","EDJ":"m",
"EFFECT":"l","FIELD":"g","FT":"c","IPC":"b","MEANS":"j","OPERATION":"k","SUBJECT":"i","patent_number":"test"}
]
{% extends "layout.html" %}
{% block body %}
{{patent_number}}
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

<div id="content">
    <div class="container-fluid">
        <h1>公報データ</h1>
        <p>
<div id="app">
    <mycomp />
</div>

<!-- mycomp7s temlpate -->
{% raw %}
<script type="text/x-template" id="template">
    <table border="1">
        <tr v-for="(raw,rawi) in item_list" v-bind:key = "rawi">
            <td v-for="(cell,celli) in raw" v-bind:key = "rawi * 10 + celli" width = "50" >{{cell}}</td>
        </tr>
    </table>
</script>
{% endraw %}

<!-- vue script -->
<script>
Vue.config.devtools = true;
d = {{items|tojson|safe}};

Vue.component('mycomp', {
    template: '#template',
    data:function(){ return {item_list: d }; }
});

new Vue({
    el: '#app',
});

</script>


{% endblock %}

 

0

1Answer

下記のようにFLASK側で転置する方法としました。
VUE.JS側での書き方が分からないのですが、
良い方法がありましたら、教えて頂ければと思います。

items = [mapios[0].keys(),mapios[0].values(),result[0].values()]
items2 = [list(x) for x in zip(*items)]
return render_template(        'index.html',        items = items2,  patent_number = question_id)
0Like

Your answer might help someone💌