列表

详情


2823. 深度对象筛选

给定一个对象 obj 和一个函数 fn,返回一个经过筛选的对象 filteredObject

函数 deepFilter 应该在对象 obj 上执行深度筛选操作。深度筛选操作应该移除筛选函数 fn 输出为 false 的属性,以及在键被移除后仍然存在的任何空对象或数组。

如果深度筛选操作导致对象或数组为空,没有剩余属性,deepFilter 应该返回 undefined,表示在 filteredObject 中没有有效数据。

 

示例 1:

输入:
obj = [-5, -4, -3, -2, -1, 0, 1], 
fn = (x) => x > 0
输出:[1]
解释:所有不大于 0 的值都被移除。

示例 2:

输入:
obj = {"a": 1, "b": "2", "c": 3, "d": "4", "e": 5, "f": 6, "g": {"a": 1}}, 
fn = (x) => typeof x === "string"
输出:{"b":"2","d":"4"}
解释:所有值不是字符串的键都被移除。在筛选过程中移除键后,任何导致为空的对象也被移除。

示例 3:

输入:
obj = [-1, [-1, -1, 5, -1, 10], -1, [-1], [-5]], 
fn = (x) => x > 0
输出:[[5,10]]
解释:所有不大于 0 的值都被移除。在筛选过程中移除值后,任何导致为空的数组也被移除。

示例 4:

输入:
obj = [[[[5]]]], 
fn = (x) => Array.isArray(x)
输出:undefined

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
/** * @param {Object|Array} obj * @param {Function} fn * @return {Object|Array|undefined} */ var deepFilter = function(obj, fn) { };

javascript 解法, 执行用时: 224 ms, 内存消耗: 62.1 MB, 提交时间: 2023-10-15 13:24:16

/**
 * @param {Object} obj
 * @param {Function} fn
 * @return {Object|undefined}
 */

// 注意:
// 如果obj是array的话, delete obj[key]只会将对应元素替换成null
 
var deepFilter = function(obj, fn) {
    let toDelete = {};
    for (const key in obj) {
        let val = obj[key];
        // 如果val是Array或是非空的Object, 继续filter
        if (typeof val === "object" && val) {
            let filteredVal = deepFilter(val, fn);
            if (_.isEmpty(filteredVal)) {
                toDelete[key] = true;
            } else {
                obj[key] = filteredVal;
            }
        // 如果是简单元素, 用fn来决定是否删除.
        } else if (!fn(val)) {
            toDelete[key] = true;
        }
    }
    if (Array.isArray(obj)) {
        obj = obj.filter((_, i) => !toDelete[i]);
    } else {
        Object.keys(toDelete).forEach(key => {
            delete obj[key];
        });
    }
    if (_.isEmpty(obj)) {
        return undefined;
    }
    return obj;
};

javascript 解法, 执行用时: 152 ms, 内存消耗: 59.4 MB, 提交时间: 2023-10-15 13:23:59

/**
 * @param {Object|Array} obj
 * @param {Function} fn
 * @return {Object|Array|undefined}
 */
var deepFilter = function(obj, fn) {
    var isObject = (tempObj) => {
        return Object.prototype.toString.call(tempObj) === '[object Object]'
    }
    var handleObject = (object) => {
        const result = {};
        for(const key in object){
            const value = object[key];
            if (Array.isArray(value) || isObject(value)){
                const res = deepFilter(value, fn);
                if (res){
                    result[key] = res;
                }
            } else {
                if (fn(value)){
                    result[key] = value;
                }
            }
        }
        return Object.keys(result).length === 0 ? undefined : result;
    }
    var handleArray = (array) => {
        const result = [];
        array.forEach(item => {
            if (Array.isArray(item) || isObject(item)){
                const res = deepFilter(item,fn);
                if (res){
                    result.push(res);
                }
            } else if (fn(item)){
                result.push(item);
            }
        })
        return result.length ? result : undefined;
    }
    if (Array.isArray(obj)){
        return handleArray(obj);
    }
    if(isObject(obj)){
        return handleObject(obj);
    }
};

上一题