前言:锻炼自己的思想,规范自己的编程思路。
问题:
现给定一个对象或数组 obj,返回一个 精简对象 。精简对象 与原始对象相同,只是将包含 假 值的键移除。该操作适用于对象及其嵌套对象。数组被视为索引作为键的对象。当 Boolean(value) 返回 false 时,值被视为 假 值。
你可以假设 obj 是 JSON.parse 的输出结果。换句话说,它是有效的 JSON。
示例:
输入:obj = [null, 0, false, 1]
输出:[1]
解释:数组中的所有假值已被移除。
思路:
compactObject函数使用 Array.isArray(obj) 来检查传入的参数obj 是否为数组。如果是数组,则使用 Array.prototype.filter() 方法来过滤掉假值。filter(Boolean) 等价于 filter(item => Boolean(item)),它将返回一个新数组,其中只包含原数组中的真值。
然后,使用Array.prototype.map() 方法来遍历新数组中的每一项。对于每一项,如果它是一个对象,则递归调用compactObject 函数来处理它;否则,直接返回该项。
如果传入的参数 obj 不是数组,则创建一个空对象result 作为结果。然后,使用 for...in 循环遍历 obj 中的每一个键。对于每一个键,获取其对应的值,并使用 Boolean(value) 来检查该值是否为真值。如果是真值,则将其添加到结果对象中。如果该值是一个对象,则递归调用 compactObject 函数来处理它;否则,直接将其添加到结果对象中。
最后,返回结果对象。
基于上述思考,代码如下:
var compactObject = function(obj) {
if (Array.isArray(obj)) {
return obj.filter(Boolean).map(item => typeof item === "object" ? compactObject(item) : item);
} else {
let result = {};
for (let key in obj) {
let value = obj[key];
if (Boolean(value)) {
result[key] = typeof value === "object" ? compactObject(value) : value;
}
}
return result;
}
};
执行结果如下图:
新知识:
Array.prototype.filter() 方法用于创建一个新数组,该数组包含原数组中通过所提供函数实现的测试的所有元素。它不会改变原始数组,而是返回一个浅拷贝,其中包含与原始数组相同的元素(其中某些元素已被过滤掉)。