🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

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

Q&A

解決済

6回答

1613閲覧

配列に格納されているn個の数字が、全て一致していたらok、一致していなかったらnoと出力したい

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

0グッド

0クリップ

投稿2019/12/09 23:31

編集2019/12/10 18:21

やりたい事

変数linesの配列に数字nが与えられているので、
以下の条件で全て一致する場合は、その数字をそのまま出力し、それ以外は「no」と出力して下さい。

条件:
変数linesの配列にはlines[0]にのみ値が入るものとする
lines[0]の配列に格納されてある値は『数字』で0〜9とする事
数字の数(数列)は変化するため、数が増えても減っても対応する事

var lines = ['数字nの値(0〜9)までのいずれかの数字が入っていて、かつ何列あるかはその都度変わります。)']

どのようなコードを書いたら期待通りの動作をしてくれるでしょうか?
ご回答よろしくお願いします。

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

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

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

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

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

shiracamus

2019/12/10 00:28

> 変数linesの配列に数字nが与えられているので、 lines = [1111, 1111, 1111, 1112] といった配列ではないのですか?
退会済みユーザー

退会済みユーザー

2019/12/10 09:48 編集

shiracamusさん、 ご質問ありがとうございます。 > lines = [1111, 1111, 1111, 1112] といった配列ではないのですか? いえ、違います。 今回の場合、変数linesにはlines[0]しかないと仮定します。 lines[]には、['1111']以外にも['33335']や['66666666']の様に数字の数(0〜9)が変化します。 説明不足でした、申し訳ございません。
think49

2019/12/10 09:25

用語の使い方がおかしいです。 「配列」と「数列」を混同しているのでは? > 変数linesの配列に数字nが与えられているので、 この前提が成り立っていないので、正しい表現に修正してください。
退会済みユーザー

退会済みユーザー

2019/12/10 10:08 編集

失礼しました。 lines[0]に数字nが格納されていて、その値(数字の数(0~9)と数列)は変化します。
think49

2019/12/10 12:13 編集

質問文を [編集] して修正ください。 質問文では「文字列('1111')に対してどう処理するか」は書かれていますが、「配列(['1111'])に対してど処理するか」は書かれていません。 そちらも質問文に書いてください。
退会済みユーザー

退会済みユーザー

2019/12/10 14:01

はい、承知しました。
shiracamus

2019/12/10 14:35 編集

> する lines[0]の配列に格納されてある値は『数値』で0〜9とする事 数値と数字は違うものですよ。
退会済みユーザー

退会済みユーザー

2019/12/10 18:19 編集

数字に統一しておきます。
guest

回答6

0

文字列の法則を判定するには、正規表現を使います。
JavaScript 正規表現まとめ

今回の場合ですと、こんな感じになるんじゃないでしょうか?
正規表現:同じ文字の繰り返しをマッチする表現

JavaScript

1const line = new RegExp(/(\d)\1+/); 2let lines = ['1111','1212','2222']; 3 4lines.forEach( i=>{ 5 if( line.test(i) ) { 6 console.log(i); 7 } else { 8 console.log('no'); 9 } 10}); 11 12//'1111' 13//'no' 14//'2222'

訂正
今回の課題だと
const line = new RegExp(/(\d)\1+/);ではなく、
const line = new RegExp(/^(\d)\1*$/);が正しいそうです。
kasa0様、ご指摘ありがとうございますm(_ _)m

投稿2019/12/10 00:41

編集2019/12/10 01:01
H40831

総合スコア975

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

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

kasa0

2019/12/10 00:44

それだと、'1122'もマッチしてしまうので、 /^(\d)\1*$/ ですね。
H40831

2019/12/10 00:47

訂正ありがとうございます!m(_ _)m
退会済みユーザー

退会済みユーザー

2019/12/10 09:55 編集

H40831さん、kasa0さん、 ご回答ありがとうございます^ ^ 後ほど、上記のコードを実行して確認させて頂きます。
退会済みユーザー

退会済みユーザー

2019/12/11 08:44

const line = new RegExp(/^(\d)\1*$/); で無事動作を確認する事ができました。 ありがとうございます!
guest

0

こんにちは

引数の文字列str が、単一の文字から構成されるかどうかを判定する関数 containsSingleChar(str) を作るとすれば、一例として以下のように書けます。

javascript

1containsSingleChar = str => new Set(str).size === 1;

以下は、上記を使ったサンプルです。

参考になれば幸いです。

追記

containsSingleChar(str) の別案です。ただし、引数が空文字列の場合、true を返します。

javascript

1containsSingleChar = str => [...str].every(e => e === str[0]);

投稿2019/12/10 01:00

編集2019/12/10 02:12
jun68ykt

総合スコア9058

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

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

jun68ykt

2019/12/10 04:43

@yusuke0803さん コメントから失礼します。 上記に記載した私の回答は、「文字列がひとつの文字だけで構成されている」ことは判定しますが「数字だけで構成されている」ことは判定していません。数字一文字だけで構成されることを判定するにはH40831さんが回答されているように正規表現を使うのが良さそうです。
退会済みユーザー

退会済みユーザー

2019/12/10 09:07

jun68yktさん、 ご回答ありがとうございます。 確かに今回の場合ですと、文字列ではなく、数字だけで構成されているため、正規表現の方が良さそうですね。 しかし、文字列の判定の仕方も知りたかったので、是非参考にさせて頂きます。 ありがとうございます!
jun68ykt

2019/12/10 19:21

どういたしまして。参考になれば幸いです。
guest

0

一つしかデータを持たない配列同士の比較であれば0番目要素を判定してください

javascript

1console.log([1111]===[1111]);//false 2console.log([1111][0]===[1111][0]);//true

細かいデータにわかれているなら文字列化してください

javascript

1var l1=[1,1,1,1]; 2var l2=[1,1,1,1]; 3var l3=[1,1,1,2]; 4console.log(l1===l2);//false 5console.log(l1===l3);//false 6console.log(JSON.stringify(l1)===JSON.stringify(l2));//true 7console.log(JSON.stringify(l1)===JSON.stringify(l3));//false

投稿2019/12/10 00:19

yambejp

総合スコア116661

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

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

退会済みユーザー

退会済みユーザー

2019/12/10 09:04

yambejpさん、 ご回答ありがとうございます。 後ほど上記のコードを実行して確認させて頂きます。
退会済みユーザー

退会済みユーザー

2019/12/11 08:52

上記のコードですが 今回はlines[0]に格納されている値だけで同じ数字かを評価する必要があるため、上記のようなコードでは思っていた動作はできませんでした。 質問の内容が分かりにくく申し訳ございませんでした。。 比較する対象が1つ以上あれば評価出来ると思うので、今後の勉強で是非参考にさせて頂きます! ありがとうございました。
guest

0

要件よくわかっていないけど、タイトルに対しての回答です。
2つ書いてみました。
lines の一文字目を取得して、連続文字列(数字)を作り、それと元の文字列(数字)を比較するってコンセプトです。

配列に格納されているn個の数字が、全て一致していたらok、一致していなかったらnoと出力したい

単純に1文字目を与えられた文字数分つなげて比較するバージョン

JavaScript

1var lines1 = ['1111']; 2// var lines1 = ['1112']; 3var new_lines = [Array(lines1[0].length + 1).join(lines1[0][0])]; 4console.log(lines1[0] === new_lines[0] ? 'ok' : 'no');

与えられた文字数分の 111... に、0 から 9 を掛けて 000... から 999... を作り比較するバージョン

JavaScriot

1var lines1 = ['1111']; 2// var lines1 = ['1112']; 3var flag = false; 4var base = Array(lines1[0].length + 1).join(1); 5for (let i = 0; i<=9; i++){ 6 if(+lines1[0] === base * i)flag = true; 7} 8console.log(flag ? 'ok' : 'no');

タイトルに従うとlines1[0].length + 1の箇所はnかなぁ。

投稿2019/12/10 10:19

編集2019/12/11 08:53
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2019/12/10 14:24

te2jiさん、 ご回答ありがとうございます。 質問内容変更させて頂きましたが、ご回答いただいたコードで後ほど確認してみます!
退会済みユーザー

退会済みユーザー

2019/12/11 08:34

ご回答いただいたコードで思っている処理ができました。 ありがとうございます。 上記のコードで分からない事があり、追加でご回答頂けると助かります。 まず、変数baseのArray(lines1[0].length + 1).join(1);はどのような処理をしているのでしょうか? 試しにconsole.log(base)をしたら1111と出力されました。 次に、join(1)を消し、console.log(base)で出力したら、[ <5 empty items> ]と出力されたのですが、join(1)とするとなぜ1111と出力されるのでしょうか? それと、+lines1[0]の+はどのような意味があるのでしょうか?
退会済みユーザー

退会済みユーザー

2019/12/11 09:02 編集

回答に簡単に説明を入れてみました。 base は 111... を作ってます。000...,111...,222...~999... を作るための前処理です。 処理の細かいところは、適当にマニュアル見てください。 あと + は JavaScript 特有の書き方ですね。 文字列から数字へキャストしています。 000... 部分の比較の都合でキャストしました。
guest

0

ベストアンサー

全ての数字が同じ場合は、その数字をそのまま出力し、それ以外は「no」と出力して下さい。

と、

この場合は全ての数字が一致しているため、okと出力します。

は矛盾しています。

数字nの値や数は変化する

これだと、lines の配列のサイズが変化するのか、配列のサイズは常に 1 で、数字と桁数だけが変化するのか不明です。

※質問内容に不備がある場合は、コメントよりお知らせ下さい。

なんて書く前に、自分で質問内容を見直してください。

とりあえず、全ての数字が同じ場合はその数字をそのまま出力する、かつ配列のサイズは常に 1 であると仮定して回答しておきます。

javascript

1var lines = ['1111']; 2console.log(~lines[0].split('').reduce((a,b)=>a==b?a:-1)?lines[0]:'no');

投稿2019/12/10 00:43

2KOH

総合スコア999

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

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

退会済みユーザー

退会済みユーザー

2019/12/10 10:09 編集

2KOHさん、 ご指摘ありがとうございます。 問題分には上記の通り書いていましたので、その様な記述になってしまいました。 lines[]には、1以外にも['33335']や['66666666']の様に配列の長さ(length)や数字の数(0〜9)が変化します。
2KOH

2019/12/10 09:43

> ['33335']や['66666666']の様に配列の長さ(length)や数字の数(1〜9)が変化します。 これだと、文字列の長さは変化してますが、配列の長さは1のままなのですが。
退会済みユーザー

退会済みユーザー

2019/12/10 09:45

失礼しました。 配列の長さは変わりません。 lines[0]の中に格納されている数字nの長さが変わります。
2KOH

2019/12/10 09:48

なら、上のコードが回答例の一つになっています。
退会済みユーザー

退会済みユーザー

2019/12/10 09:50

ありがとうございます^ ^ 後ほど上記のコードを実行して確認させて頂きます。
退会済みユーザー

退会済みユーザー

2019/12/11 07:34 編集

ご回答いただいたコードで無事解く事ができました。 ありがとうございます。 もしお答えいただけるのであれば、2つ程お聞きしたいのですが、 lines[0]の前にチルダ?(~)がありますが、これはどのような処理が行われているのでしょうか? console.logで出力してみたのですが、 ~lines['1111']の場合-1112と出力されました。 自分で調べた限り、整数をビット反転させると必ず符号を反転して1引いた数になり、−1なら0、1なら-2になるというものでしたが、今回の使用例ではいまいち理解できませんでした。 それと、もう一つですが、 条件(三項)演算子のfalseの処理に-1とありますが、なぜ-1しているのでしょうか? 簡単でいいので説明いただけると助かります。
2KOH

2019/12/11 08:47

この回答の冒頭で質問内容の不備を指摘しているように、この質問は回答者のことを考えていないような質問内容だと感じました。 そのため、わざと質問者のことを考えていないような内容で回答をしたのですが、まさかマジレスされるとは思っていませんでした。 なので、説明しろと言われると逆に困るのですが、簡単に説明すると次のとおりです。 lines[0].split('').reduce((a,b)=>a==b?a:-1) の部分は、全ての数字が同じなら -1 以外、そうでないなら -1 となるようにしています。 ここで、「~x」は、x が -1 なら 0、x がそれ以外の整数値なら 0 以外となるので、 ~lines[0].split('').reduce((a,b)=>a==b?a:-1) とすることで、全ての数字が同じなら 0 以外、そうでないなら 0 となります。 ここで、整数値の評価結果は、0 の場合は偽で、0 以外の場合は真となるので、 ~lines[0].split('').reduce((a,b)=>a==b?a:-1)?lines[0]:'no' とすることで、全ての数字が同じなら lines[0]、そうでないなら 'no' となります。 こういうロジックで実装しているために ~ や -1 を使っています。
退会済みユーザー

退会済みユーザー

2019/12/11 09:02

分かりやすいご回答ありがとうございます。 また、 >この質問は回答者のことを考えていないような質問内容だと感じました。 と思われている事に大変反省しております。 自分では大丈夫と思っていただけに、ご指摘をいただくまで気づきもしませんでした。 以前の質問にも同じような事をご指摘い頂いていて、もう少し理解を深めるまではテラテイルの活用は控えさせて頂きます。 また、2KOHさんのご回答が一番理解できたのでベストアンサーにさせて頂きます。 ありがとうございました。
guest

0

配列の中の数字をsplit()で分解されてますよね。
分解すると配列が得られるので、その配列の要素の数マイナス1のぶんループしてみるのはいかがでしょうか?

JavaScript

1var _flg = true; 2var _a = ['1111']; 3var _b = _a[0].split(''); 4 5for (var i=0; i<(_b.length - 1); i++) { 6 // 今現在の要素と、次の要素の値を比較する 7 if (_b[i] !== _b[i + 1]) { 8 _flg = false; 9 break; 10 } 11} 12 13console.log('result = ' + _flg);

投稿2019/12/10 00:08

XNXSXMXR

総合スコア239

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

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

退会済みユーザー

退会済みユーザー

2019/12/10 09:53

XNXSXMXRさん、 ご回答ありがとうございます^ ^ 後ほど上記のコードを実行して確認させて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問