2705. 精简对象

简介: 2705. 精简对象

说在前面

🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。

题目描述

现给定一个对象或数组 obj,返回一个 精简对象精简对象 与原始对象相同,只是将包含 值的键移除。该操作适用于对象及其嵌套对象。数组被视为索引作为键的对象。当 Boolean(value) 返回 false 时,值被视为 值。

你可以假设 objJSON.parse 的输出结果。换句话说,它是有效的 JSON。

示例 1:

输入: obj = [null, 0, false, 1]
输出: [1]
解释: 数组中的所有假值已被移除。

示例 2:

输入: obj = {"a": null, "b": [false, 1]}
输出: {"b": [1]}
解释: obj["a"] 和 obj["b"][0] 包含假值,因此被移除。

示例 3:

输入: obj = [null, 0, 5, [0], [false, 16]]
输出: [5, [], [16]]
解释: obj[0], obj[1], obj[3][0], 和 obj[4][0] 包含假值,因此被移除。

提示:

  • obj 是一个有效的 JSON 对象
  • 2 <= JSON.stringify(obj).length <= 10^6

解题思路

首先,代码检查传入的参数是否为数组。如果是数组,就使用 reduce 方法对数组进行迭代。在每次迭代中,首先检查当前项 item 是否存在(非 null、undefined 或空值)。如果存在,进一步判断 item 的类型是否为对象。如果是对象,则递归调用 compactObject 函数对其进行紧凑处理,并将结果加入到结果数组 acc 中。如果 item 不是对象,则直接将其加入到结果数组中。最后,返回紧凑处理后的结果数组。

如果传入的参数不是数组,则假定它是一个对象。代码通过 Object.entries 方法将对象转换为一个键值对数组,并使用 reduce 方法对键值对数组进行迭代。在每次迭代中,首先检查当前值 value 是否存在(非 null、undefined 或空值)。如果存在,进一步判断 value 的类型是否为对象。如果是对象,则递归调用 compactObject 函数对其进行紧凑处理,并将结果赋值给结果对象 acc 的相应键 key。如果 value 不是对象,则直接将其赋值给结果对象的相应键。最后,返回紧凑处理后的结果对象。

AC代码

/**
 * @param {Object|Array} obj
 * @return {Object|Array}
 */
var compactObject = function (obj) {
  if (Array.isArray(obj)) {
    return obj.reduce((acc, item) => {
      if (item) {
        if (typeof item === "object") {
          const tmp = compactObject(item);
          acc.push(tmp);
        } else {
          acc.push(item);
        }
      }
      return acc;
    }, []);
  } else {
    return Object.entries(obj).reduce((acc, [key, value]) => {
      if (value) {
        if (typeof value === "object") {
          const tmp = compactObject(value);
          acc[key] = tmp;
        } else {
          acc[key] = value;
        }
      }
      return acc;
    }, {});
  }
};

公众号

关注公众号『前端也能这么有趣』,获取更多有趣内容。

说在后面

🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『前端也能这么有趣』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。

目录
相关文章
|
1月前
|
存储 缓存 Java
结构体和类在性能方面有哪些差异?
【10月更文挑战第30天】结构体和类在性能方面有哪些差异?
|
3月前
|
存储 NoSQL 数据处理
组合和继承怎么集成一个性能较好的项目
组合与继承是面向对象编程的核心概念,前者通过对象间关联实现高效解耦,后者则重用代码以节省空间和内存。组合常用于现代项目,利用代理与依赖注入简化代码管理;而继承简化了子模块对父模块资源的应用,但修改会影响整体。随着分层解耦及微服务架构如SpringCloud的出现,这些技术进一步优化了数据处理效率和服务响应性能,尤其在分布式存储与高并发场景下。同步异步调用、Redis分布式应用等也广泛运用组合与继承,实现代码和内存空间的有效复用。
|
3月前
|
缓存 Java 数据库连接
扩展类的附加特性
扩展类的附加特性
26 0
|
5月前
|
数据安全/隐私保护 C++
|
5月前
|
存储 安全 编译器
|
6月前
|
JavaScript 前端开发
JavaScript模块化将复杂软件分解为独立模块,提高代码可读、维护、复用和扩展性。
【6月更文挑战第27天】模块化将复杂软件分解为独立模块,提高代码可读、维护、复用和扩展性。JavaScript模块化有CommonJS(Node.js,`require()`/`module.exports`)、AMD(RequireJS,异步,`define()`/`require()`)和ES6 Modules(官方标准,`import`/`export`)。打包工具如Webpack、Rollup处理兼容性,使模块能在不同环境中运行。
36 0
|
存储 安全 Java
基础一:一切都是对象
基础一:一切都是对象
105 0
|
编译器
由编译器特别支持的包装
由编译器特别支持的包装
68 0
|
存储 负载均衡 Oracle
面向(过程、对象、组件、服务)编程
面向(过程、对象、组件、服务)编程
321 0
【自然框架】内部类库、控件的引用关系(最新整理,基本稳定)
  和以前相比,减少了一个项目,把Control_Interface合并到CommonFunction里面。这样引用关系就简单多了。   基本上分为三个层次:类库、自定义控件、页面基类。其中的 MetaData 负责元数据的定义和加载。
650 0

热门文章

最新文章