Skip to content

Latest commit

 

History

History

2705.Compact Object

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 

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;
};