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

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

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

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

Q&A

解決済

3回答

974閲覧

JavaScript 文字列操作に関しての質問

ah6BD2gZo5GnjnT

総合スコア46

JavaScript

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

0グッド

0クリップ

投稿2020/10/03 03:00

以下の文字列を作りたいです。

{a:"a0",b:"b1"}

ただし条件あり。
❶reduceを用いること
❷["a","b"]のデータを用いること

JavaScript

1const ary = ["a", "b"]; 2var result = ary.reduce(function (accu, current, index) { 3 return `${accu}${current}:"${current}${index}",`; 4}, ""); 5console.log("{" + result + "}");

不明点
私のソースコードで配列を出力すると、
**{a:"a0",b:"b1",} **
このように表示されてしまいます。何がいけないのでしょうか?

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

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

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

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

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

guest

回答3

0

皆様の意見を元にして、以下のコードに仕上がりました。

const ary = ["a", "b"];
var result = ary.reduce(function (accu, current, index) {
accu[current] = current + index;
return accu;
}, {});

投稿2020/10/04 07:31

ah6BD2gZo5GnjnT

総合スコア46

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

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

0

原因と対策

{a:"a0",b:"b1",}
このように表示されてしまいます。何がいけないのでしょうか?

下記コードで常にカンマを末尾に付け足しているからです。

JavaScript

1return `${accu}${current}:"${current}${index}",`;

そこまでヒントがあれば、このコードを書けたあなたなら自力で解決可能だと思います。

  • index値が最後なら、カンマを出力しない
  • 配列にpushしてjoinで結合
  • 最後に末尾のカンマを取り除く
  • カンマを最初に持ってきて、index=0ならカンマを出力しない

いろいろと方法はあるでしょう。

Array.prototype.reduce

Array.prototype.reduce を使うべき場面を探すのが私も難しいと思いました。
reduceの外に処理を持ってきてもいいなら、いくつか方法はありますが、

JavaScript

1const array = ["a", "b"]; 2var result = array.reduce(function (result, current, index) { 3 return result[1].push(`${current}:"${current}${index}"`), result; 4}, ['{',[],'}']).join(''); 5console.log(result);

reduce内で完結させるなら、難易度が大幅にUPします。

JavaScript

1const array = ["a", "b"]; 2var result = array.reduce(function (result, current, index) { 3 return index ? result.replace(/(?=}$)/, `,${current}:"${current}${index}"`) : `{${current}:"${current}${index}"}`; 4}, ''); 5console.log(result);

reduceを使うために多少強引なつくりになっている間は否めません。
最も、本質問は課題コードで実用性は度外視なのだと思いますが、課題でもある程度の実用性あるコードを書かせて欲しいもので余り良い課題とは思いませんでした。
map,joinを使うことを条件に入れるほうが自然な気がしますね。

可読性

私の書いたコードなんですが、読みにくいでしょうか?

気になったのはコードではなく、条件「reduceを用いること」の方です。
質問文のコードなら、文字列が対象なのでmapは使えず、reduceを使いますが、

  1. reduce後に最後のカンマを取り除く
  2. indexが最後なら、カンマを出力しない (毎回、indexを検査するのでパフォーマンス低下)
  3. array#shift()で最初の要素だけ別途処理してから、reduceする

の対策が必要となりますので、どれを採用するかを踏まえて吟味する必要があります。
個人的には可読性は使ったコードにどれだけ熟知しているか次第だと思うので、言及しません。

ただ、「一つの文字列を結合して増やしていく方法」は「配列からmap->joinする方法」と比較して、パフォーマンスに優れるメリットがあります。
パフォーマンスを優先させるポリシーでコードを書くなら、私は while or for を使いたくなります。

JavaScript

1function sample (array) { 2 if (!array.length) return '{}'; 3 const value = array[0]; 4 let body = '{' + value + ':' + value + '0'; 5 6 for (let i = 1, len = array.length; i < len; ++i) { 7 const value = array[i]; 8 body += ',' + value + ':""' + value + '0"'; 9 } 10 11 return body + '}'; 12} 13 14const array = ["a", "b"]; 15console.log(sample(array));

結局、コードの良し悪しは「自分がコードに何を求めるか」次第です。
言い換えるなら、何を目的として「reduceを用いること」を条件に指定したのかです。
そこが読み取れませんでした。
背景もなしに条件が明示されたので、条件に意味はない「課題のコード」のように思いました。

Re: ah6BD2gZo5GnjnT さん

投稿2020/10/03 04:09

編集2020/10/03 21:43
think49

総合スコア18162

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

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

think49

2020/10/03 04:09

解決済でしたが、既に回答文を書いてしまったので、投稿します。
ah6BD2gZo5GnjnT

2020/10/03 06:00

私の書いたコードなんですが、読みにくいでしょうか?
think49

2020/10/03 21:43

親記事に追記しました
guest

0

ベストアンサー

reduceより、mapしてjoinがストレートですが、reduceでやるなら、カンマは前に付けて、

案1:accuが空の場合にカンマを付けない
案2:最後に先頭のカンマを取り除く

くらいですかね。

JavaScript

1var result = ary.reduce(function (accu, current, index) { 2 return accu=="" ? `${current}:"${current}${index}"` 3 : `${accu},${current}:"${current}${index}"`; 4}, ""); 5console.log("{" + result + "}");

JavaScript

1var result = ary.reduce(function (accu, current, index) { 2 return `${accu},${current}:"${current}${index}"`; 3}, ""); 4console.log("{" + result.substring(1) + "}");

投稿2020/10/03 03:24

編集2020/10/03 03:26
otn

総合スコア84489

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問