沼田的瀬戸際メモ(仮)

プログラミング超絶素人がプログラマの方達の宇宙語を理解するための備忘録的なメモ。

プレミアムフライデーとは何だったのか。そして今日ハマったコード達

今日はプレミアムフライデーですが、15時に帰ってる人などいるのです?もし居たらその人がプレミアム級に珍しいのではなかろうか。
消費を喚起したいなら今日だけ消費税無し!とかやりたまえ。そしたらプレミアムフライデーで1月分の肉を買い込んでやるわ。

こんにちは。瀬戸際の沼田です。

さて、今日はコードを書いていてハマったというか、新しく知ったJavaScriptメソッドについて書いていくよ。

今日ハマったメソッド(JavaScript)

今日はAIZU ONLINE JUDGEの下記問題を解いていました。(まだここです汗)
3つの数の整列 | プログラミング入門 | Aizu Online Judge


問題.
3つの整数を読み込み、それらを値が小さい順に並べて出力するプログラムを作成して下さい。

Input
3つの整数が空白で区切られて与えられます。

Output
小さい順に並べ替えた3つの整数を1行に出力して下さい。整数の間に1つの空白を入れて下さい。

Constraints
1 ≤ 3つの整数 ≤ 10,000

やっとこさ書いたコードがコチラ

'use strict'
process.stdin.resume()
process.stdin.setEncoding('utf8')
process.stdin.on('data', function hoge(input) {
  var arr = input.split(' ').map(Number)
  arr.sort(
    function(a, b) {
      return (a < b ? -1 : 1)
    }
  )
  console.log(arr.join(" "))
  return arr
})

んで出力はコレ
f:id:aed2797:20170526202136p:plain


数行なのですが、下記2種のメソッドの挙動を理解しておらず、とりま書いてみるべ状態でやっていたので、ハマったという。

起きた問題など

・onの中の関数とsplitを適用する関数を違う関数にしてしまう。
・出力を配列で出力してしまう。(joinメソッドの存在を知らなかった)
・return arrの後にconsole.log(arr)を書いてしまう。
etc...

split()に関しては、文字列をカンマとか半角スペースとか区切りたいときに使うやつや!ぐらいの認識でした...。

いけませんな。ということで、split()とjoin()についてまとめてみる。

文字列→配列のsplit()、配列→文字列のjoin()

split() メソッド

splitメソッドは、文字列を複数の部分文字列に区切ることにより、Stringオブジェクトを文字列の配列に分割する。
String.prototype.split() - JavaScript | MDNより

ちなみにsplitの後にある()内に記述する、ものをseparator(セパレータ)というらしい。下の例ではseparatorは半角スペースとかカンマになってます。

使ってみるとこんな感じでした。

var a = "1,2,3,4,5"
var array = a.split(" ")

これは、変数aを半角スペースで区切った配列としてね。という命令で、変数aに半角スペースが無いので、arrayは[ '1,2,3,4,5' ]という要素1つの配列になる。

var a = "1,2,3,4,5"
var array = a.split(",")

これは、変数aをカンマで区切った配列としてね。という命令で、変数aにカンマがあるので、arrayは[ '1', '2', '3', '4', '5' ]という要素5つの配列になる。

上記2つの違いを理解していなかったため、3時間近くハマっていました...。

join()メソッド

joinメソッドは、配列のすべての要素を繋いで文字列にする。
Array.prototype.join() - JavaScript | MDNより

これを知らなかったので、最後の出力の段階で出力が配列になっていて、AIZU ONLINE先生がAcceptしてくれないという。

使ってみるとこんな感じでした。

var a = ["1", "2", "3", "4", "5"]
var txt = a.join(",")

これは、変数aをカンマで区切った文字列としなさい。という命令で、txtは”1,2,3,4,5”という文字列になる。

やれやれ。

今日より明日は改善するように頑張っていきます(><)