😺
TypeScriptの自分用技術スタック
概略
すごい基本的なことを記録しています。
判定
指定した文字を含むかどうかを判定
const isMatch = str.includes("指定文字");
指定した文字(複数)を含むかどうかを判定
const specialChars = ['.', '*']
const isMatch = specialChars.some(char => str.includes(char));
指定した要素を含むかどうかを判定
/// false
const isMatch = ['AAA', 'BBB'].includes('CCC');
処理分岐
truthyならTrue、falsyならFalaseにする
// metaが存在し、meta.errorがtruthyならtrue
const isError = !!(meta && meta.error)
配列
文字列を1文字ずつループする
最適な方法
for (const char of s) {
// doing...
}
当初は以下for (let index = 0; index < s.length; index++)のみ書いていましたが、他ユーザさんからサロゲートペアに正しく対応できないとご指摘をいただきましたので、for (const char of s)に書き換えました。
良くない方法
for (let index = 0; index < s.length; index++) {
const char = s[index];
}
2つの記述の違い
for (let index = 0; index < s.length; index++) { const char = s[index]; }
- これはUTF-16の「コードユニット」単位でループする。
- サロゲートペア文字は2つのコードユニットで1文字なので、途中で分断されてしまい正しく1文字として扱えない。
for (const char of s) { ... }
- これはES6の「イテレータ」で、ユニコードの「コードポイント」単位でループする。
- サロゲートペアも1文字として正しく取得できます。
const s = 'A😊B';
/// サロゲートペア(絵文字や漢字)を扱えない
for (let i = 0; i < s.length; i++) {
console.log(s[i]); // A, �, �, B
}
/// ササロゲートペア(絵文字や漢字)を扱える
for (const char of s) {
console.log(char); // A, 😊, B
}
並び順を変更する
デフォルトのsort()を使うと、文字列順にソートする。number[]であっても文字列順になるので注意。
const l1 = [2, 4, 3, 21]
/// [ 2, 21, 3, 4 ]
const sortedL1 = [...l1].sort();
sort((a,b) => a-b)を使った場合の並び替えのルールは次の通り。
- 戻り値が負ならaが先(
a - b < 0 → aが先(昇順)) - 戻り値が正ならbが先(
a - b > 0 → bが先(降順)) - 戻り値が0なら順序そのまま(
a - b = 0 → 順序そのまま))
const l1 = [2, 4, 3, 21]
/// [ 2, 3, 4, 21 ]
const sortedL1 = [...l1].sort((a, b) => a - b);
/// [ 21, 4, 3, 2 ]
const reversedL1 = [...l1].sort((a, b) => b - a);
Math
大きい方の値を採用する
const res = Math.max(num1, num2);
Math
大きい方の値を採用する
const res = Math.max(num1, num2);
Map
Mapはキーと値のペアでデータを管理できる多次元配列に似たコレクション。多次元配列と違う点は次の通り。
- キーは文字列以外の型(数値やオブジェクトなど)が使用可能。
- 要素の順番を保持してくれる。
- 要素数が増えても検索速度は一定。(多次元配列は要素数に比例して検索速度が変わる)
Mapに追加する
// キーが存在すれば上書き、なければ追加
map.set('キー','値');
Map
2, 4, 3, 21]
/// [ 2, 21, 3, 4 ]
const sortedL1 = [...l1].sort();
`sort((a,b) => a-b)`を使うと、`a-b`が`true`ならbの次にaが来るようになる。(b→aに並び替える)`a-b`が`0`なら何もしない。
```ts
const l1 = [2, 4, 3, 21]
/// [ 2, 3, 4, 21 ]
const sortedL1 = [...l1].sort((a, b) => a - b);
/// [ 21, 4, 3, 2 ]
const reversedL1 = [...l1].sort((a, b) => b - a);
Discussion
この方が良いのでは?(サロゲートペア対応とか必要なので
文字列を1文字ずつループする
-1 は true 0 が false なので 0を超える場合は の方が良いのでは?
ありがとうございます!
ご指摘の通りでした。サロゲートペア対応ができないことを知らなかったため、追記させていただきました。
すみません。もしよければ教えてください。
私の認識では結果が、マイナス/プラス/0 の3パターンで並び替えをしているものだと思っていました。そのため、truthyかfalsyかは関係ないと思っていましたが、間違っておりますでしょうか?
(記事の書き方が中途半端だったため、記事を修正しました!)