[JavaScript][PHP] Setのないプログラミング言語でハッシユをSetとして使う

2017年11月20日月曜日

JavaScript PHP

Setがない。

PHPやJavaScriptではデータ構造として、Set(集合)がない。
少なくとも、PythonのようなSetは存在しない。
※ちなみにSPLでもSetはないみたい。

ただし、PHPの配列は連想配列(ハッシュ)でもあり、JavaScripのオブジェクトもプロパティに連想配列的にアクセスできるので、これをそのままSetとして利用することができる。
具体的には配列のキーにSetの要素を設定して、配列の値には適当な値を設定しておく。

PHPの場合

PHPの場合には以下のようになる。
$fruits = [ 'apple' => true, 'banana' => true ];

if (array_key_exists('apple', $fruits)) {
    echo 'apple', PHP_EOL;
}

if (array_key_exists('orange', $fruits)) {
    echo 'orange', PHP_EOL;
}

値には何を設定してもいいんだけど、次に説明するJavaScriptの場合なんかを考えると、trueを入れておくのがよさそう。

JavaScriptの場合

JavaScriptの場合には以下のようになる。
var fruits = { apple: true, banana: true }

if (fruits['apple']) {
  console.log('apple');
}
if (fruits['orange']) {
  console.log('orange');
}

こちらはもっと素直にオブジェクトのプロパティに直接アクセスして、要素の存在判定ができる。
JavaScriptは存在しないプロパティにアクセスするとエラーではなく、undefinedを返してくるためだ。
console.log(fruits['apple'] + ':' + fruits['orange']);
true:undefined

だから、要素の値としては真偽値として評価された時にtrueとなる値を設定しておくのがいい。
オブジェクトの場合、残念ながら、fruits.lengthのようにサイズが取得できない。
サイズを取得する場合はObject.kesyを使う。
console.log(fruits.length);
console.log(Object.keys(fruits).length);
undefined
2

※JavaScriptはES6からSetが使えるようになっているので、使える場合は素直にそっちを使った方が良さそう。

ちょっとした小ネタではあるけど、役に立つ時もあるんじゃないかな。