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

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

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

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

Q&A

2回答

550閲覧

javascript の replace 処理を行ったところ・・

hanabatake

総合スコア0

JavaScript

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

0グッド

1クリップ

投稿2021/12/21 01:08

入力値があって、

04323033412

9 → 22
8 → 20
・・・

と変換したうえで、足し算するのですが、

var dial = array.replace(/0/g, "24").replace(/1/g, "6").replace(/2/g, "8").replace(/3/g, "10").replace(/4/g, "12").replace(/5/g, "14").replace(/6/g, "16").replace(/7/g, "18").replace(/8/g, "20").replace(/9/g, "22");
console.log(dial);

の出力結果が、
22 10 16 14 10 14 120 10 22 20

になり、7 が 18になるところ、120 になったり、0 が 2012 になったりします。

解決方法はあるのでしょうか。

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

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

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

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

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

int32_t

2021/12/21 01:15

入力は単一の文字列のようですが、出力は文字列である必要はありますか? 数値のリストでもよいのでは?
hanabatake

2021/12/21 01:28

入力値を別の数字に変換して足し上げるので、 splitとjoinをかけて、0 4 3 2 3 0 3 3 4 1 2 スペースをつけてもう一度出し直したうえで、 数字の変更をかけまして、 もう一度配列にして、reduceで足し算をすればいいのかなというところでの過程になります。 ※一桁と二桁が混入するので、後ほど配列にするためにあらかじめスペースを入れておこうとしています。
yambejp

2021/12/21 01:59

計算根拠がわからないのですが、変換して隣り合った数字を足すのでしょうか? 0+4→24+12=36ということではない?
hanabatake

2021/12/21 02:20

まさにその通りです。 足し算の前段階の数字の変換がうまくいっていないのです。 mapで配列から変換するといいとご回答いただいたのですが、 mapの使い方で再びつまずいています。
guest

回答2

0

.replace(/7/g, "18").replace(/8/g, "20")... のようにつなげると、7を置き換えた 18 が 次の replace(/8/g, "20") の置換対象になってしまって、718120 になってしまいます。

replace()のチェインはやめて、1文字ずつ個別に変換するとよいでしょう。

js

1[...'04323033412'].map(d => d == '0' ? 24 : (Number(d) * 2 + 4))

最終的に reduce() するなら、reduce() だけでよいんじゃないでしょうか。

js

1'04323033412'.split('').reduce( 2 (prev, d) => prev + (d == '0' ? 24 : (Number(d) * 2 + 4)), 0)

投稿2021/12/21 01:22

編集2021/12/21 02:07
int32_t

総合スコア21018

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

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

hanabatake

2021/12/21 02:12

ご回答ありがとうございます。 たしかに正しく変換できたのですが、 初心者の私には再現性がなく、文が長くなってもいいので、かみ砕いた 工程をお教えいただくことは可能でしょうか。
int32_t

2021/12/21 02:24

[...'04323033412'] は、'04323033412'.split('') と同じです。 d == '0' ? 24 : (Number(d) * 2 + 4) というのは質問文にある変換規則 0→24 1→6 ... 9→22 から法則性を見出して1つの式で変換するようにしたものです。 それ以外はJavaScriptの基本的なことなので、調べればわかるのではないでしょうか。
guest

0

最終的に総和を求めるならint32_tさんの回答がベストな感じですね
変換する数字も計算でだすのが効率的です。
別解になりますが、あらかじめリストを作っておいて参照するという手もありますね

javascript

1const list=[24,6,8,10,12,14,16,18,20,22]; 2const res='04323033412'.split('').reduce((x,y,z,w)=>(x instanceof Array?x:[]).concat([list[w[z-1]]+list[y]])); 3console.log(res);//[ 36, 22, 18, 18, 34, 34, 20, 22, 18, 14 ]

投稿2021/12/21 02:36

yambejp

総合スコア115012

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問