神戸プログラミングアカデミーのブログ

「未経験から」「スキルアップ」「起業を目指す」無料で学べる神戸のプログラミング学校&学習コミュニティ

Userデータを集計する

https://github.com/prog-ac/sortable-table/blob/master/assets/users.json

準備

curl https://raw.githubusercontent.com/prog-ac/sortable-table/master/assets/users.json > users.json

jsonの読み込み

const users = require("./users.json")

1. スコア降順でソートして、90点以上の人のみを表示せよ。(この問題はfor文なしで)

[
  { name: 'ヤマモト ミカコ', pref: '愛知県', birthday: '1995-05-14', score: 100 },
  { name: 'エコダ リョウスケ', pref: '石川県', birthday: '1958-11-19', score: 99 },
  { name: 'ナギサ タクマ', pref: '山梨県', birthday: '1950-04-25', score: 98 },
  { name: 'ヤマモト アケミ', pref: '石川県', birthday: '1996-09-15', score: 98 },
  { name: 'ワタナベ マイ', pref: '埼玉県', birthday: '1968-09-02', score: 97 },
  { name: 'サイトウ マアヤ', pref: '茨城県', birthday: '1981-07-26', score: 97 },
  { name: 'ヨシモト ハルカ', pref: '長野県', birthday: '1978-04-03', score: 97 },
  { name: 'ヤマダ ヨウイチ', pref: '茨城県', birthday: '1956-01-22', score: 97 },
  { name: 'アオタ ナオコ', pref: '和歌山県', birthday: '1990-03-28', score: 96 },
  { name: 'イシダ タクマ', pref: '青森県', birthday: '1986-03-14', score: 95 },
  { name: 'タナカ ヨウコ', pref: '山口県', birthday: '1966-05-22', score: 95 },
  { name: 'ムラヤマ ナオト', pref: '東京都', birthday: '1957-01-31', score: 94 },
  { name: 'ウノ ジュン', pref: '長野県', birthday: '1940-12-02', score: 94 },
  { name: 'ナカムラ ミカコ', pref: '新潟県', birthday: '1941-04-25', score: 93 },
  { name: 'ナギサ アキラ', pref: '高知県', birthday: '1955-04-10', score: 93 },
  { name: 'コンドウ ハルカ', pref: '大分県', birthday: '1947-11-08', score: 93 },
  { name: 'キムラ ナオキ', pref: '広島県', birthday: '1956-09-08', score: 91 },
  { name: 'サカモト ヤスヒロ', pref: '三重県', birthday: '1948-02-15', score: 91 },
  { name: 'キジマ ヒロシ', pref: '山形県', birthday: '1956-11-09', score: 91 },
  { name: 'スギヤマ ナオコ', pref: '三重県', birthday: '1970-04-28', score: 91 }
]

解答例

const users = require("./users.json")
const filterdUser = users.filter((user) => user.score >= 90)
console.log(filterdUser.sort((a, b) => b.score - a.score))

2. 名前(ファーストネーム)の重複している人数を集計し、人数降順でソートして表示せよ。

ユミコ:12人
ミキ:9人
ハルカ:8人
ナナミ:8人
マイ:8人
サユリ:7人
ナオキ:7人
モモコ:7人
アケミ:6人
ヨウコ:6人
ミノル:6人
マアヤ:6人
シュウヘイ:5人
トモヤ:5人
アキラ:5人
ジュン:5人
ユウキ:5人
タクマ:5人
クミコ:4人
チヨ:4人
ミカコ:4人
ヤスヒロ:4人
ヨウイチ:4人
リョウスケ:4人
カナ:4人
ナオコ:4人
ハナコ:4人
ヒデキ:4人
アスカ:3人
ナオト:3人
カズヤ:3人
ユイ:3人
ショウタ:3人
カオリ:3人
レイ:3人
マナブ:2人
ソウタロウ:2人
リョウヘイ:2人
ヨウスケ:2人
キョウスケ:2人
ヒロシ:2人
ユウタ:2人
アツシ:1人
サトミ:1人
タロウ:1人
ツバサ:1人
リカ:1人

解答例

const users = require("./users.json")

const result = []
for (let i = 0; i < users.length; i++) {
  const user = users[i]
  const firstName = user.name.split(" ")[1]
  let index = result.findIndex((r) => r.firstName === firstName)
  if (index < 0) {
    result.push({
      firstName: firstName,
      count: 1
    })
  } else {
    result[index].count++;
  }
}
result.sort((a, b) => b.count - a.count)
for (r of result) {
  console.log(`${r.firstName}:${r.count}`)
}

Array.find()を自作せよ

developer.mozilla.org

配列から条件を満たす最初の要素を返す関数find(array, callback)を作成せよ。条件に当てはまるものがなかったらundefinedを返す。

条件は 20以下 とする

node main.js 34 27 94 12 30 14 25
12

解答例

function find(array, callback) {
  let ret = undefined
  for (let i = 0; i < array.length; i++) {
    if (callback(array[i])) {
      ret = array[i]
      break
    }
  }
  return ret
}
const args = process.argv.slice(2)
console.log(find(args, (item) => {
  return item <= 20
}))

オリジナル1分タイマーを作ろう

指定したタイミングでコールバックを読んでくれる関数startMyTimer(list, callback)を作成せよ

尚、タイマー検知はsetTimeout()を使うこと

nodejs.org

setTimeout(コールバック, 経過時間, コールバックに渡す引数)

Macのスピーチコマンド

const { exec } = require('child_process')
const message = "10秒"
exec(`say ${message}`)
// const secList = [0, 30, 40, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60]
const secList = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

String.splitを自作せよ

文字列を区切り文字で分割し配列で返す関数split(str, separator)を自作せよ

function split(str, sepatator) {
}
console.log(split(process.argv[2], ","))
node main.js "aaa,bbb,444,555"
[ 'aaa', 'bbb', '444', '555' ]

解答例

function split(str, sepatator) {
  let ret = []
  let column = ""
  for (let i = 0; i < str.length; i++) {
    if (str[i] === sepatator) {
      ret.push(column)
      column = ""
    } else {
      column += str[i]
    }
  }
  ret.push(column)
  return ret
}
console.log(split(process.argv[2], ","))

指定されたインデックスが先頭になるようにして返す関数を作成せよ

配列を指定されたインデックスが先頭になるようにして返す関数rotate(arr, index)を作成せよ

docs.ruby-lang.org

  • 作成する関数の第1引数は絞り込み前の配列、第2引数は先頭にするインデックスとする
  • コマンドライン引数の1つ目をインデックス、それ以降を配列とする
const index = Number(process.argv[2])
const args = process.argv.slice(3)

rotate(args, index)

実行コマンド

node main.js 2 34 27 94 12 30 14 25
[ 94, 12, 30, 14, 25, 34, 27 ]
node main.js -2 34 27 94 12 30 14 25
[ 14, 25, 34, 27, 94, 12, 30 ]

解答例

function rotate(arr, index) {
  const ret = []
  for (let i = 0; i < arr.length; i++) {
    ret.push(arr[(i + index + arr.length) % arr.length])
  }
  return ret
}

const index = Number(process.argv[2])
const args = process.argv.slice(3)

console.log(rotate(args, index))

配列を受け取りコールバックで指定された条件のもの省いて返す関数を作成せよ

配列からコールバックで指定された条件を満たす要素を省いて返す関数 deleteIf(array, callback) を作成せよ

  • 作成する関数の第1引数は絞り込み前の配列、第2引数は評価関数とし、返り値を省いた後の配列とする
  • 使っていいメソッドはArray.pushのみとする
  • コールバックを利用し汎用的な関数にすること
  • 省く条件は10以上30以下とする

実行コマンド

node main.js 34 27 94 12 30 14 25

出力

[ 34, 94 ]

解答例

const args = process.argv.slice(2)
function deleteIf(array, callback) {
  const ret = []
  for (let i = 0; i < array.length; i++) {
    if (!callback(array[i])) {
      ret.push(array[i])
    }
  }
  return ret
}
console.log(deleteIf(args, function (item) {
  return item >= 10 && item <= 30
}))