「JavaScript」Setを用いてArray(配列)データの重複排除(ユニークに)する方法

今回は「JavaScript」Setを用いてArray(配列)データの重複排除(ユニークに)する方法をエントリーしたいと思います。

サンプルデータ

適当に数値が重複したArrayを用意します。

const numbers = [1, 1, 1, 5, 5, 5, 3, 2, 10, 9]

Setで重複排除

Setに用意したサンプルデータを渡します。

const uniqueNumbers = new Set(numbers)

確認

console.logで出力し確認してみましょう。重複が除かれた数値が出力されることが確認できます。並び順についてはSetでは昇順、降順などのソートはできないので注意しましょう。

console.log(uniqueNumbers)

Set(6) { 1, 5, 3, 2, 10, 9 }

「JavaScript」Array.prototype.sort()で複数データ(Array、配列)ソートする方法

今回は「JavaScript」Array.prototype.sort()で複数データ(Array、配列、数値、文字列)ソートする方法について解説したいと思います。

注意

今回はArray.sortを使ってソートを数値、文字列を降順、昇順でソートしますがArray.sortは破壊的な関数なため注意して使いましょう。

サンプルデータ

配列["数学点数","国語点数","理科点数","名前"]入れ子で配列でもったデータのソートを解説します。

// ["数学点数","国語点数","理科点数","名前"]
const grades = [
  [80, 50, 70, 'a'],
  [80, 60, 70, 'b'],
  [80, 60, 80, 'bb'],
  [80, 60, 80, 'bbb'],
  [80, 60, 80, 'bbbb'],
  [80, 60, 80, 'bbc'],
  [70, 70, 70, 'aba'],
  [70, 50, 70, 'cab'],
  [90, 70, 70, 'az'],
  [90, 70, 70, 'ab'],
  [90, 70, 70, 'abb'],
  [90, 50, 70, 'aa'],
  [90, 50, 60, 'baaa'],
  [90, 50, 60, 'baa'],
  [60, 50, 70, 'aaa'],
]

ソートその1

数学の点数が高い順(降順)

grades.sort((a, b) => {
  if (b[0] > a[0]) return 1
  if (b[0] < a[0]) return -1
})
console.log(grades)

[
  [ 90, 70, 70, 'az' ],
  [ 90, 70, 70, 'ab' ],
  [ 90, 70, 70, 'abb' ],
  [ 90, 50, 70, 'aa' ],
  [ 90, 50, 60, 'baaa' ],
  [ 90, 50, 60, 'baa' ],
  [ 80, 50, 70, 'a' ],
  [ 80, 60, 70, 'b' ],
  [ 80, 60, 80, 'bb' ],
  [ 80, 60, 80, 'bbb' ],
  [ 80, 60, 80, 'bbbb' ],
  [ 80, 60, 80, 'bbc' ],
  [ 70, 70, 70, 'aba' ],
  [ 70, 50, 70, 'cab' ],
  [ 60, 50, 70, 'aaa' ]
]

ソートその2

数学の点数が高い順(降順)、次に国語の点数が高い順(降順)

grades.sort((a, b) => {
  if (b[0] > a[0]) return 1
  if (b[0] < a[0]) return -1
  if (a[1] > b[1]) return 1
  if (a[1] < b[1]) return -1
})
console.log(grades)

[
  [ 90, 50, 70, 'aa' ],
  [ 90, 50, 60, 'baaa' ],
  [ 90, 50, 60, 'baa' ],
  [ 90, 70, 70, 'az' ],
  [ 90, 70, 70, 'ab' ],
  [ 90, 70, 70, 'abb' ],
  [ 80, 50, 70, 'a' ],
  [ 80, 60, 70, 'b' ],
  [ 80, 60, 80, 'bb' ],
  [ 80, 60, 80, 'bbb' ],
  [ 80, 60, 80, 'bbbb' ],
  [ 80, 60, 80, 'bbc' ],
  [ 70, 50, 70, 'cab' ],
  [ 70, 70, 70, 'aba' ],
  [ 60, 50, 70, 'aaa' ]
]

ソートその3

数学の点数が高い順(降順)、次に国語の点数が高い順(降順)、次に理科の点数が高い順(降順)

grades.sort((a, b) => {
  if (b[0] > a[0]) return 1
  if (b[0] < a[0]) return -1
  if (b[1] > a[1]) return 1
  if (b[1] < a[1]) return -1
  if (b[2] > a[2]) return 1
  if (b[2] < a[2]) return -1
})

console.log(grades)

[
  [ 90, 70, 70, 'az' ],
  [ 90, 70, 70, 'ab' ],
  [ 90, 70, 70, 'abb' ],
  [ 90, 50, 70, 'aa' ],
  [ 90, 50, 60, 'baaa' ],
  [ 90, 50, 60, 'baa' ],
  [ 80, 60, 80, 'bb' ],
  [ 80, 60, 80, 'bbb' ],
  [ 80, 60, 80, 'bbbb' ],
  [ 80, 60, 80, 'bbc' ],
  [ 80, 60, 70, 'b' ],
  [ 80, 50, 70, 'a' ],
  [ 70, 70, 70, 'aba' ],
  [ 70, 50, 70, 'cab' ],
  [ 60, 50, 70, 'aaa' ]
]

ソートその4

数学の点数が高い順(降順)、次に国語の点数が高い順(降順)、次に理科の点数が高い順(降順)、次に名前順(昇順)

grades.sort((a, b) => {
  if (b[0] > a[0]) return 1
  if (b[0] < a[0]) return -1
  if (b[1] > a[1]) return 1
  if (b[1] < a[1]) return -1
  if (b[2] > a[2]) return 1
  if (b[2] < a[2]) return -1
  if (b[3] < a[3]) return 1
  if (b[3] > a[3]) return -1
})

console.log(grades)

[
  [ 90, 70, 70, 'ab' ],
  [ 90, 70, 70, 'abb' ],
  [ 90, 70, 70, 'az' ],
  [ 90, 50, 70, 'aa' ],
  [ 90, 50, 60, 'baa' ],
  [ 90, 50, 60, 'baaa' ],
  [ 80, 60, 80, 'bb' ],
  [ 80, 60, 80, 'bbb' ],
  [ 80, 60, 80, 'bbbb' ],
  [ 80, 60, 80, 'bbc' ],
  [ 80, 60, 70, 'b' ],
  [ 80, 50, 70, 'a' ],
  [ 70, 70, 70, 'aba' ],
  [ 70, 50, 70, 'cab' ],
  [ 60, 50, 70, 'aaa' ]
]

出力結果の最初の3行に注目しましょう。文字列では'ab','abb','az'と少ない文字数を優先し次の文字が出現した場合それ(今回は'az')に推移します。

  [ 90, 70, 70, 'ab' ],
  [ 90, 70, 70, 'abb' ],
  [ 90, 70, 70, 'az' ],

「Rust」標準出力でメッセージ出力し、改行せず標準入力を受け付ける方法「std::io::stdin::read_line,print!」

今回はRustで標準出力でメッセージ出力し、改行せず標準入力を受け付ける方法を紹介したいと思います。

結論

print!でメッセージを表示「要求」後にstd::io::stdout::flushでフラッシュで表示を行い、その後std::io::stdin::read_lineで標準入力を受け付けます。

サンプルコード

std::io::Write;flush()を実行する際に必要です。

use std::io::{stdin, stdout, Write};

fn main() {
    print!("input please: ");
    stdout().flush().unwrap();

    let mut input = String::new();
    stdin().read_line(&mut input).unwrap();

    println!("input is {}", input);
}

解説

print!("input please: ");でメッセージ出力を要求しstdout().flush().unwrap();でフラッシュ(表示)させます。

その後stdin().read_line(&mut input).unwrap();で入力を受け付けます。

print!でメッセージ表示を行うため改行が入っていないため同じ行で入力を受け付けます。

実行結果

cargo run xxx
   
input please: hoge
input is hoge

「Mac」treeコマンドの導入方法「M1(arm64),Intel(i386,x86)対応」

今回はMacでtreeコマンドの導入方法を紹介したいと思います。

MacのCPUはM1に上がっているためM1でも動作するか確認してあります(M1(arm64),Intel(i386,x86)対応)

結論

brewでインストールします。アーキテクチャx86(i386)でインストールしたものでM1(arm64)も動作しました。

インストール方法

アーキテクチャの確認と設定

i386が出力されるのを確認。

arch


i386

arm64が出力される場合はアーキテクチャx86(i386)に変更します。

arch -x86_64 zsh
arch


i386

brewでインストール

brewでインストールします。

brew install tree

動作確認

i386

arch


i386

tree結果

tree
.
└── sample
    └── src
        └── app.js

2 directories, 1 file

arm64

arch


arm64

tree結果

tree
.
└── sample
    └── src
        └── app.js

2 directories, 1 file

「Rust」bin配下にアプリを配置しアプリ単体を実行する方法

今回はRustで開発する際にbin配下にアプリを配置しアプリ単体を実行する方法を紹介したいと思います。

結論

bin配下に作成したアプリをcargo run --bin アプリ名で対象のアプリ単体で実行できます。

アプリの作成

通常通りcargo new xxx(xxxは任意のアプリ名)でアプリを作成しその配下にbinディレクトリを作成していきます。

cargo new sample
cd sample
mkdir src/bin

treeでディレクトリ構成の確認

tree結果

tree

.
├── Cargo.toml
└── src
    ├── bin
    └── main.rs

サンプルコード

今回は動作確認のためbin配下に1から10を足すアプリsum_1_to_10.rsを作成します。

fn main() {
    let mut total = 0;

    for i in 1..=10 {
        total += i;
    }

    println!("total:{}", total);
}

bin配下のアプリを実行

cargo run --bin アプリ名で対象のアプリ単体で実行できます。

cargo run --bin sum_1_to_10


total:55

【React,Jest, testing library】ReferenceError: fetch is not definedエラーの解消方法【vite,webpack】

今回はReactアプリを作成する際にReferenceError: fetch is not definedエラーが出た際の解消方法をエントリーします。

ケースとしてはcreate react appではなくwebpackviteでアプリを作成しアプリ内でfetchを使いAPIなどを利用したケースをJest + Testing libraryでテストを行った際にReferenceError: fetch is not definedが発生しました。

エラー概要

コンポーネントで呼び出しているfetchでエラーとなっています。

ReferenceError: fetch is not defined

      26 |   const handleClick = async (user: User) => {
      27 |     
    > 28 |     const response = await fetch('http://localhost:8080/xxxx', {
         |                      ^
      29 |       method: 'POST',
      30 |       mode: 'cors',
      31 |       cache: 'no-cache',

解消方法

cross-fetch/polyfillを用いて解消します。

npm install --save-dev cross-fetch

テストコードサンプル

import 'cross-fetch/polyfill'でポリフィルをimport

<Sample />コンポーネントが今回fetchを利用しているコンポーネントです。

import { render, screen } from '@testing-library/react'
import 'cross-fetch/polyfill'

describe('Sample', () => {
  it('test', async () => {
    render(
      <Sample />
    )
    expect(screen.getByText('テストコード')).toBeInTheDocument()
  }
}

SMARTフレームワークとは

SMARTフレームワークとは5つの要素「具体的」「測定可能」「行動指向」「関連がある」「時間制約」を含んだ問いかけや目標設定です。

5つの要素

具体的

その問いかけ(目標設定)は具体的か?

測定可能

その問いかけ(目標設定)は測定可能か?

行動指向

その問いかけ(目標設定)の答えは何かしらの行動計画を立てるのに意味があるか?

関連がある

その問いかけ(目標設定)は解決しようとしている特定の課題に関連しているか?

時間制約

その問いかけ(目標設定)の答え(達成条件)は調査対象(達成対象)となる特定の期間のものであるか?

避けた方が良い問いかけ

SMARTフレームワークにて問いかける際に避けた方が良い代表的な問いかけ例

誘導尋問

質問の中に回答を示唆している。

「このサービスは高いと思いますよね?」

選択式(クローズドエンド)

回答から一言しか得られず有益な情報になりえない。

「このサービスに満足していただけましたか?」

漠然、曖昧

具体的ではないケースやコンテキストがあってないケース

「このサービスはあなたにあってますか?」