/**
* @param {Object|Array} obj
* @param {Function} fn
* @return {Object|Array|undefined}
*/
var deepFilter = function(obj, fn) {
};
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
提示:
fn
是一个返回布尔值的函数obj
是一个有效的 JSON 对象2 <= JSON.stringify(obj).length <= 10**5
原站题解
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); } };