返回介绍

solution / 2700-2799 / 2705.Compact Object / README

发布于 2024-06-17 01:03:01 字数 2817 浏览 0 评论 0 收藏 0

2705. 精简对象

English Version

题目描述

现给定一个对象或数组 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 <= 106

解法

方法一:递归

如果 obj 不是对象或为空,函数会原封不动地返回,因为无需检查非对象值中的键。

如果 obj 是一个数组,它会使用 obj.filter(Boolean) 过滤掉虚假值(如 nullundefinedfalse、0、""),然后使用 map(compactObject) 对每个元素递归调用 compactObject。这样可以确保嵌套数组也被压缩。

如果 obj 是一个对象,则会创建一个新的空对象 compactedObj。它会遍历 obj 的所有键,并对每个键在相应的值上递归调用 compactObject,然后将结果存储在值变量中。如果值是真实的(即不是虚假的),它就会将其赋值给具有相应键的压缩对象。

时间复杂度 $O(n)$, 空间复杂度 $O(n)$。

type Obj = Record<any, any>;

function compactObject(obj: Obj): Obj {
  if (Array.isArray(obj)) {
    const temp = [];
    for (const item of obj) {
      if (item) {
        if (typeof item === 'object') temp.push(compactObject(item));
        else temp.push(item);
      }
    }
    return temp;
  }
  for (const [key, value] of Object.entries(obj)) {
    if (!value) delete obj[key];
    else if (typeof value === 'object') obj[key] = compactObject(value);
  }
  return obj;
}
var compactObject = function (obj) {
  if (obj === null || typeof obj !== 'object') {
    return obj;
  }

  if (Array.isArray(obj)) {
    return obj.filter(Boolean).map(compactObject);
  }

  const result = {};
  for (const key in obj) {
    const value = compactObject(obj[key]);
    if (Boolean(value)) {
      result[key] = value;
    }
  }
  return result;
};

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文