はじめに
配列の要素ごとの要素数のカウントを調べている時にチルダ演算子の「なるほど」と思った使い方をご紹介します。
#チルダ演算子(~)とは
NOT 演算は、各ビットで実行します。NOT a は、a を反転した値 (1 の補数として知られています) を出力します。
引用
~9
の場合
10進数9
を2進数(1001
)に変換。正確には32ビットになったものとして扱います。
つまり、00000000000000000000000000001001
となります。
これを反転した値11111111111111111111111111110110
=-10
(10進数)が~9
です。
文字列の場合NaN
になり-1
になるみたいです。
let num = 9;
console.log(~num);
// -10
let str = "a";
console.log(~str);
// -1
~-1
が0
になる性質を生かして、indexOf
で検索したい際に値が存在しない場合を以下のように書けます。
let arr = ['a', 'b', 'c'];
let str = 'd';
if (!~arr.indexOf(str)) {
console.log('なし')
}
###二重でチルダ(~~)を使用した時
32ビットの整数になるため、小数点は切り捨てられます。
console.log(~~1.0)
// 1
console.log(~~2)
// 2
console.log(~~2.3)
// 2
console.log(~~1.045)
// 1
// 文字の場合
console.log(~~"a")
// 0
console.log(~~"bb")
// 0
console.log(~~"ccc")
// 0
console.log(~~NaN)
// 0
#チルダ(~)を要素ごとのカウント
let arr = [1, 2, 3, 4, 1, 1, 2];
let map = {};
arr.filter((num) => (map[num] = ~~map[num] + 1));
console.log(map);
// { '1': 3, '2': 2, '3': 1, '4': 1 }
上記の性質を使い、各配列の要素をkey
とし、value
にその配列内での要素ごとの個数をカウントする事できます。