以下の文字列を作りたいです。
{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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
総合スコア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を使いますが、
- reduce後に最後のカンマを取り除く
- indexが最後なら、カンマを出力しない (毎回、indexを検査するのでパフォーマンス低下)
- 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総合スコア18189
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/03 06:00
2020/10/03 21:43
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総合スコア85901
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。