跳转至

2727. 判断对象是否为空

题目描述

给定一个对象或数组,判断它是否为空。

  • 一个空对象不包含任何键值对。
  • 一个空数组不包含任何元素。

你可以假设对象或数组是通过 JSON.parse 解析得到的。

 

示例 1:

输入:obj = {"x": 5, "y": 42}
输出:false
解释:这个对象有两个键值对,所以它不为空。

示例 2:

输入:obj = {}
输出:true
解释:这个对象没有任何键值对,所以它为空。

示例 3:

输入:obj = [null, false, 0]
输出:false
解释:这个数组有 3 个元素,所以它不为空。

 

提示:

  • obj 是一个有效的 JSON 对象或数组
  • 2 <= JSON.stringify(obj).length <= 105

 

你可以在 O(1) 时间复杂度内解决这个问题吗?

解法

方法一:遍历

思考

判断对象或数组是否没有任何可枚举键。取 \(Object.keys\) 再比长度可以得到答案,同时会先物化全部键。

\(for\cdots in\) 一旦碰到第一个自有或继承的可枚举键即返回 \(false\),否则为空。对 JSON 解析得到的普通对象与数组,这一遍历即为是否为空。

我们可以遍历对象或数组,如果遍历到了第一个元素,就返回 false,否则返回 true

时间复杂度 \(O(1)\),空间复杂度 \(O(1)\)

1
2
3
4
5
6
function isEmpty(obj: Record<string, any> | any[]): boolean {
    for (const x in obj) {
        return false;
    }
    return true;
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
/**
 * @param {Object | Array} obj
 * @return {boolean}
 */
var isEmpty = function (obj) {
    for (const x in obj) {
        return false;
    }
    return true;
};

方法二

思考

方法一依赖遍历短路。直接比较 \(Object.keys(obj).length\)\(0\),语义更直观,代价是先收集键名。

1
2
3
function isEmpty(obj: Record<string, any> | any[]): boolean {
    return Object.keys(obj).length === 0;
}

评论