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

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

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

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

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

2回答

1007閲覧

オブジェクトの内容をscssの形で出力する方法を知りたいです

takopo

総合スコア484

JavaScript

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

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2018/07/02 02:20

編集2018/07/02 03:01

前提・実現したいこと

質問させてください。
下のようなオブジェクトを作成しました。

javascript

1var obj = { 2 foo: [ 3 'apple', 4 'orange' 5 ], 6 bar: [ 7 'apple', 8 'orange', 9 'melon' 10 ] 11}

こちらを下のようにscssの形に加工して(ドットやスペース、改行、中括弧、インデントなどを付けて)出力させたいと思っております。

scss

1.foo { 2 &-apple { 3 4 } 5 6 &-orange { 7 8 } 9} 10 11.bar { 12 &-banana { 13 14 } 15 16 &-tomato { 17 18 } 19 20 &-melon { 21 22 } 23} 24

試したこと

下記のプログラムを作成し、こちらでもある程度想定した形で出力できたのですが、改行とインデント(space)をいくつもつなげないといけないので、コードが煩雑で読みにくくなってしまいます。これをもう少し効率良くシンプルに書く方法がありましたら、ご教授いただけますと助かります。。

javascript

1var space = " "; // インデント 2var output = ''; // 完成したコードを入れる用 3 4for (var key in obj) { 5 var txt = `.${key} {\n`; 6 for (var value of obj[key]) { 7 txt += `\n${space}&-${value} {\n${space.repeat(2)}\n${space}}\n`; 8 } 9 txt += `}\n`; 10 output += txt; 11} 12 13console.log(output);

拙い質問ですみません。
よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ES2018 の Object.fromEntries() が使えるとシンプルに書けそう。
もし babel-preset-es2018 を使用していれば Polyfill の部分は不要。
https://codepen.io/og24715/pen/rKPqpX?editors=0010

// Object.fromEntries の Polyfill Object.prototype.fromEntries = function _objectFromEntries(arr) { var fromEntries = {}; for (var k = 0; k < arr.length; ++k) { var array = arr[k]; fromEntries[array[0]] = array[1]; } return fromEntries; } var obj = { foo: [ 'apple', 'orange' ], bar: [ 'apple', 'orange', 'melon' ] } var scss = Object.fromEntries(Object.entries(obj).map(([className, classValue]) => { const suffixes = classValue.map(suffix => [`&-${suffix}`, {}]); return [`.${className}`, Object.fromEntries(suffixes)]; })); console.log(scss);

投稿2018/07/02 03:14

og24715

総合スコア832

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

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

og24715

2018/07/02 03:18

あーすみません回 .scss のテキストに書き出す必要があるんですね。 質問の趣旨に沿ってないのでこの回答は無視してください。
takopo

2018/07/02 03:41

ご回答ありがとうございます。 こちらこそ分かりにくい質問をしてすみませんでした。 書いていただいた内容も参考にさせていただきます。
guest

0

ベストアンサー

まあ、とりあえずはString.repeatですかね

投稿2018/07/02 02:42

KazuhiroHatano

総合スコア7804

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

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

takopo

2018/07/02 03:04

ご回答ありがとうございます。repeatメソッドというものがあるのですね。勉強になりました。 コードの${space}${space}となっていたところを、${space.repeat(2)}としてみたのですが、使い方はこのような形で合っていますでしょうか。できればもう少し簡明になればなと思っております。
KazuhiroHatano

2018/07/02 03:33

jsは${space.repeat(2)}みたいな感じで良いようですね うちはおよそ同じようなことをphpでやってますが、出力部分はおよそ同じようなコードです ただ、多次元配列をもとにするようにしているのでインデントのレベルを渡せるようにして再帰関数でやってます
takopo

2018/07/02 04:04 編集

コードの方大丈夫そうで良かったです。 多次元配列や再帰関数は本で読んだ程度の知識しかなく、私にはハイレベルなのですが、それを使えばインデントの数も調整できるみたいなので、もう少し勉強して使えるようになりたいと思います。 とりあえず今の私のスキルでできるのはこの辺までの気がしますので、質問は閉じさせていただきますね。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問