【JS】オブジェクトが空であることを判定する

jsでオブジェクトが空(={})であることを判定する方法がいくつかあるっぽいので、メモしておく。

Object.keys(obj).length

Object.keys() - JavaScript | MDN
Object.keys() 静的メソッドは、指定されたオブジェクトが持つプロパティの名前の配列を、通常のループで取得するのと同じ順序で返します。

いくつか調べた中で、多かったやり方がこちら。

Object.keys(obj).lengthを使用して、ObjectKey配列を取得し、判定する方法です。

function isEmpty(obj) {
  return !Object.keys(obj).length
}

console.log(isEmpty({}))          // -> true
console.log(isEmpty({'a': 'a'}))  // -> false

同じObject.keys(obj).lengthを使用して、こんな感じでも判定できますね。

var obj = {}

console.log(0 === Object.keys(obj).length)  // -> true
console.log(!Object.keys(obj).length)       // -> true

for(…in…)

上述した、Object.keys().lengthを使う方法は、Chromeのバージョンによっては極端に速度が劣化する場合があるようです。
現行のものは既に修正されているようですが、古いバージョンに対応しなければならなくなったときは以下を使うことも視野に入れる必要があるでしょう。

function isEmpty(obj) {
  for (let i in obj) {
    return false
  }
  return true
}

console.log(isEmpty({}))          // -> true
console.log(isEmpty({'a': 'a'}))  // -> false

ここからは推測ですが、もしかすると他のブラウザ(の古いバージョン)でも速度劣化が見られるかもしれません。

JSON.stringify(obj)

JSON.stringify() - JavaScript | MDN
JSON.stringify() メソッドは、ある JavaScript のオブジェクトや値を JSON 文字列に変換します。置き換え関数を指定して値を置き換えたり、置き換え配列を指定して指定されたプロパティのみを含むようにしたりすることも...

これでも出来なくはないけど、動作が遅いみたい。測定はしていないので詳細は不明です。

var obj = {}

console.log(JSON.stringify(obj) === '{}')  // -> true

まとめ

基本的には、一つ目のObject.keys(obj).lengthを使っておけば問題なさそう。
この判定を何度も繰り返し行う必要がある場合は、動作速度を調べてみて、使うものを選ぶ必要がありますね。

タイトルとURLをコピーしました