【力扣】2727. 判断对象是否为空

【力扣】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

二、解决方案

概述

任务是确定输入的对象或数组是否为空。一个空对象不应包含任何键值对,而一个空数组不应该包含任何元素。输入被假定为 JSON.parse 的输出。

在我们继续之前,首先澄清一些你可能会经常听到的关键点:

JSON: JSON 是一种流行的数据交换格式,它作为 XML 的轻量级替代品。它广泛用于以结构化格式传输和存储数据。JSON 由两种主要数据结构组成:对象和数组。数据表示为键值对的组合,对象用花括号 {} 括起来,数组用方括号 [] 括起来。对象中的键必须是字符串,而值可以是任何有效的 JSON 数据类型,包括对象和数组。

JSON 对象的示例:

json 复制代码
{
  "name": "Pavitr Prabhakar",
  "age": 17,
  "city": "Mumbattan"
}

JSON 数组的示例:

json 复制代码
[
  "Peter",
  "Gwen",
  "Miles"
]

JSON.parse()JSON.parse() 是 JavaScript 中内置的函数,它将 JSON 字符串转换为 JavaScript 对象、数组或原始值(如字符串、数字、布尔或 null)。它以有效的 JSON 字符串作为输入,并返回相应的 JavaScript 对象、数组或原始值。这允许开发人员以本机 JavaScript 格式处理 JSON 数据。

使用 JSON.parse() 的示例:

js 复制代码
const jsonString = '{"name":"Pavitr Prabhakar","age":17,"city":"Mumbattan"}';
const parsedObject = JSON.parse(jsonString);
console.log(parsedObject.name); // 输出: Pavitr Prabhakar
console.log(parsedObject.age); // 输出: 17
console.log(parsedObject.city); // 输出: Mumbattan

JavaScript 中的对象: 对象用于存储键值对的集合。对象的键可以是可以转换为字符串的任何值,相应的值可以是任何数据类型,包括对象和数组。

使用对象的示例:

js 复制代码
const person = {
  name: "Pavitr Prabhakar",
  age: 17,
  city: "Mumbattan"
};
console.log(person.name); // 输出: Pavitr Prabhakar
console.log(person.age); // 输出: 17
console.log(person.city); // 输出: Mumbattan

现在如何查找长度或大小?在 JavaScript 中,长度或大小属性用于确定数组中元素的数量或对象中键值对的数量。对于数组,长度属性返回最高数字索引加一。对于对象,长度属性不可用,因此我们需要使用Object.keys()等其他方法来获取键值对的数量。

使用长度属性的示例:

js 复制代码
const spiders = ["Peter", "Gwen", "Miles"];
console.log(spiders.length); // 输出: 3

const person = {
  name: "Pavitr Prabhakar",
  age: 17,
  city: "Mumbattan"
};
console.log(Object.keys(person).length); // 输出: 3

方法

第一种方法 是使用JSON.stringify将输入数组/对象转换为字符串。如果数组或对象为空,它将返回一个具有开头和结尾的括号或花括号的字符串。

第二种方法 是使用如上建议的Object.keys()来获取长度,然后验证它是否为空。

第三种方法 是仅使用 for 循环迭代器来检查是否有内容可迭代,如果有,表示对象不为空,如果没有可迭代的内容,表示对象为空。

方法 1:使用 JSON.stringify

当你使用JSON.stringify()字符串化一个对象时,结果的 JSON 字符串将以字符串形式表示对象的键值对。在这个上下文中,结果字符串的 "length" 属性将表示字符串中的字符数,而不是原始对象中键值对的数量。

例如,考虑以下对象:

js 复制代码
const person = {
  name: "Pavitr Prabhakar",
  age: 17,
  city: "Mumbattan"
};

如果使用JSON.stringify()字符串化此对象,它将生成以下 JSON 字符串:

js 复制代码
{"name":"Pavitr Prabhakar","age":17,"city":"Mumbattan"}

此 JSON 字符串的长度将包括开头和结尾的花括号、引号、冒号和逗号。

因此在我们的情况下,它应该有一个长度为两,即表示开头和结尾的括号/花括号。

js 复制代码
var isEmpty = function(obj) {
    if (JSON.stringify(obj).length <= 2) return true
    else return false
};
复杂度分析:

时间复杂度:O(n),其中 n 是对象的大小

空间复杂度:O(n),其中 n 是对象的大小

方法 2:使用 Object.keys

我们可以使用Object.keys()检查键的长度,如果它为 0,则返回 true,否则返回 false。

js 复制代码
var isEmpty = function(obj) {
  return Object.keys(obj).length === 0
};
复杂度分析:

时间复杂度:O(n),其中 n 是对象的大小

空间复杂度:O(n),其中 n 是对象的大小

方法 3:使用循环

如果数组/对象不为空,解释器将进入 for-in 循环,因此将运行第一个返回语句 false。如果为空,解释器将不进入 for-in 循环,因此将执行第二个返回语句 true。

js 复制代码
var isEmpty = function(obj) {
    for (const _ in obj) return false;
    return true;
};
复杂度分析:

时间和空间复杂度均为 O(1),因为我们只是检查是否可以进入循环。

时间复杂度: O(1)

空间复杂度: O(1)

面试提示

  1. 空对象和没有属性的对象有什么区别?

    空对象是指不包含任何键值对的对象。这意味着对象不包含任何属性。另一方面,没有属性的对象仍然存在,可能将来会有属性。它只是表示当前没有定义任何属性。

  2. 如何在 JavaScript 中检查对象是否为空,而不使用其键的长度?

    在不使用其键的长度的情况下检查对象是否为空的另一种方法是使用Object.keys()方法。此方法返回对象自身可枚举属性名(键)的数组。然后,你可以检查数组的长度是否为零,以确定对象是否为空。

  3. 什么是纯粹的 JavaScript 对象(POJO)

    纯粹的 JavaScript 对象(POJO)是一个术语,用来描述使用对象字面量语法或 Object() 构造函数创建的简单 JavaScript 对象。它指的是不具有从自定义原型或内置 JavaScript 类继承的专用行为或方法的对象。POJO 通常用作数据传输对象(DTO)或用于存储和访问数据的简单容器。

相关推荐
吃着火锅x唱着歌9 分钟前
LeetCode 962.最大宽度坡
算法·leetcode·职场和发展
无限进步_19 分钟前
【C++】C++11的类功能增强与STL变化
java·前端·数据结构·c++·后端·算法
一只小小Java21 分钟前
Echarts单表多图实现
前端·javascript·echarts
跟着珅聪学java21 分钟前
Element UI 的 Tabs 标签页开发教程
javascript·vue.js·elementui
WL_Aurora26 分钟前
Python 算法基础篇之排序算法(一):冒泡、选择、插入
python·算法·排序算法
凌波粒28 分钟前
LeetCode--257. 二叉树的所有路径(二叉树)
算法·leetcode·职场和发展
AI算法沐枫29 分钟前
大一学生如何入门机器学习,深度学习,学习顺序如何?
人工智能·python·深度学习·学习·线性代数·算法·机器学习
竹林81832 分钟前
用Viem替换ethers.js:一次合约交互的"减负"实战,我总算把TypeScript类型搞明白了
前端·javascript
codealy35 分钟前
Rust 核心理论: 高并发与异步(三)
算法·rust
日月云棠42 分钟前
JAVA数据结构与算法 - 基础:常用集合简述
java·算法