2705. 精简对象
2705. 精简对象
题目
Given an object or array obj
, return a compact object.
A compact object is the same as the original object, except with keys containing falsy values removed. This operation applies to the object and any nested objects. Arrays are considered objects where the indices are keys. A value is considered falsy when Boolean(value)
returns false
.
You may assume the obj
is the output of JSON.parse
. In other words, it is valid JSON.
Example 1:
Input: obj = [null, 0, false, 1]
Output: [1]
Explanation: All falsy values have been removed from the array.
Example 2:
Input: obj =
Output:
Explanation: obj["a"] and obj["b"][0] had falsy values and were removed.
Example 3:
Input: obj = [null, 0, 5, [0], [false, 16]]
Output: [5, [], [16]]
Explanation: obj[0], obj[1], obj[3][0], and obj[4][0] were falsy and removed.
Constraints:
obj
is a valid JSON object2 <= JSON.stringify(obj).length <= 10^6
题目大意
现给定一个对象或数组 obj
,返回一个 精简对象 。
精简对象 与原始对象相同,只是将包含 假 值的键移除。该操作适用于对象及其嵌套对象。数组被视为索引作为键的对象。当 Boolean(value)
返回 false
时,值被视为 假 值。
你可以假设 obj
是 JSON.parse
的输出结果。换句话说,它是有效的 JSON。
提示:
obj
是一个有效的 JSON 对象2 <= JSON.stringify(obj).length <= 10^6
解题思路
- 对于输入的对象或数组,使用递归方法处理每个元素。
- 如果是数组,遍历其元素并递归处理每个元素,构建新的数组,只保留非假值元素。
- 如果是对象,遍历其属性并递归处理每个属性的值,构建新的对象,仅保留非假值属性。
- 使用
Boolean(value)
检查每个值是否为假值(包括false
、0
、""
、null
、undefined
和NaN
)。
复杂度分析
时间复杂度:
O(n)
,其中n
是输入对象或数组中所有元素的总数,每个元素都需要被访问一次,因此复杂度为线性。空间复杂度:
O(m)
,其中m
是输出结果中有效属性或元素的数量。需要额外的空间来存储精简后的结果。
代码
/**
* @param {Object|Array} obj
* @return {Object|Array}
*/
var compactObject = function (obj) {
// 处理数组,递归并过滤掉假值
if (Array.isArray(obj)) {
return obj.reduce((acc, cur) => {
const item = compactObject(cur);
// 仅添加非假值的属性
if (Boolean(item)) {
acc.push(item);
}
return acc;
}, []);
}
// 处理对象,递归并构建新对象
else if (typeof obj == 'object' && obj !== null) {
let res = {};
for (let key in obj) {
const item = compactObject(obj[key]);
// 仅添加非假值的属性
if (Boolean(item)) {
res[key] = item;
}
}
return res; // 返回新的对象
}
// 如果是基本类型,直接返回原值
return obj;
};