Skip to content

精简对象

问题

现给定一个对象或数组 obj,返回一个 精简对象 。

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

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

示例 1:

输入:obj = [null, 0, false, 1]

输出:[1]

解释:数组中的所有假值已被移除。

示例 2:

输入:obj =

输出:

解释: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] 包含假值,因此被移除。

答案

var compactObject = function(obj) {
    function dfs(obj){
        if(!obj) return false;
        if(typeof obj !=='object') return obj;
        if(Array.isArray(obj)){
            const newArr = [];
            for(let i=0;i<obj.length;i++){
                const cur=obj[i];
                const subRes=dfs(cur);
                if(subRes){
                    newArr.push(subRes);
                }
            }
            return newArr;
        }
        const newObj = {};
        for(const key in obj){
            const subRes = dfs(obj[key]);
            if(subRes){
                newObj[key]=subRes;
            }
        }
        return newObj;
    }
    return dfs(obj);
};

扩展

递归深度优先搜索(DFS)

概述

在这种方法中,我们使用递归的深度优先搜索(DFS)的概念。主要思想是递归地遍历对象的深度并重建对象或数组,而不包含任何假值。

算法

基本情况:如果当前值是假值,则返回 false。如果当前值不是对象,则返回该值。

处理数组:如果当前值是数组,我们遍历数组并递归处理每个项。如果递归调用的返回值为真,我们将其添加到一个新数组中。

处理对象:如果当前值是对象,我们遍历对象的键,并递归处理每个值。如果递归调用的返回值为真,我们将其添加到一个新对象中。

返回结果:最后,我们返回清理后的对象或数组。