Open6

個人用メモ<JS/TS>

おかしおかし

文字数をカウント(サロゲートペア対策済み)

const hoge = "fugafuga";
[...hoge].length;
// -> 8

const fuga = "𠮟";
[...fuga].length;
// -> 1

ちなみに'𠮟'.lengthは2となる。これの対策のため、一旦スプレッド構文を使って一文字ずつの配列に分解して、その配列の長さをカウントする。

追記: これでも結合文字列(Grapheme cluster)には対応していない。例えば、「👨‍👩‍👦‍👦」は7文字扱いになってしまう。これを一文字として扱うにはIntl.Segmenterを使うのがよさそう

おかしおかし

配列から空要素を削除

const hoge = ['あ', '', 'い']
const deleted = hoge.filter(v => v)
// -> ['あ', 'い']
おかしおかし

三項演算子

Pythonとごっちゃになったのでメモしておく

条件式 ? trueの時に実行される式 : falseの時に実行される式 

ちなみにPythonは

trueの時に実行される式 if 条件式 else falseの時に実行される式 
おかしおかし

ある配列が別の配列の部分集合(subset)となっているか判定

Array.prototype.every()Array.prototype.includes()を組み合わせる。

const array1 = [1, 30, 39, 29, 10, 13];
const array2 = [1, 39, 29];
const array3 = [1, 2];

const res2 = array2.every((e) => array1.includes(e)); //true
const res3 = array3.every((e) => array1.includes(e)); //false

関数化して利用すると便利。

const isSubset = (array1: any[], array2: any[]) => array2.every((e) => array1.includes(e));
// JavaScriptの場合は以下
// const isSubset = (array1, array2) => array2.every((e) => array1.includes(e));

console.log(isSubset([1, 2, 3, 4, 5, 6, 7], [5, 7, 6])); // true
console.log(isSubset([1, 2, 3, 4, 5, 6, 7], [5, 8, 7])); // false

参考記事

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/every#ある配列が別の配列の部分集合であるかどうかを調べる