2775. 将 undefined 转为 null 🔒
2775. 将 undefined 转为 null 🔒
题目
Given a deeply nested object or array obj
, return the object obj
with any undefined
values replaced by null
.
undefined
values are handled differently than null
values when objects are converted to a JSON string using JSON.stringify()
. This function helps ensure serialized data is free of unexpected errors.
Example 1:
Input: obj =
Output:
Explanation: The value for obj.a has been changed from undefined to null
Example 2:
Input: obj =
Output:
Explanation: The values for obj.a and obj.b[1] have been changed from undefined to null
Constraints:
obj
is a valid JSON object or array2 <= JSON.stringify(obj).length <= 10^5
题目大意
给定一个深层嵌套的对象或数组 obj
,并创建该对象 obj
的副本,将其中的任何 undefined
值替换为 null
。
当使用 JSON.stringify()
将对象转换为 JSON 字符串时,undefined
值与 null
值的处理方式不同。该函数有助于确保序列化数据不会出现意外错误。
示例 1:
输入: obj =
输出:
解释: obj.a 的值已从 undefined 更改为 null 。
示例 2:
输入: obj =
输出:
解释: obj.a 和 obj.b[1] 的值已从 undefined 更改为 null 。
提示:
obj
是一个有效的 JSON 对象或数组2 <= JSON.stringify(obj).length <= 10^5
解题思路
通过判断输入是数组还是对象,分别创建一个新的空数组或对象(
res
),以便存储最终的结果。因为需要深度复制原对象或数组,保证不修改原对象。使用
for...in
循环遍历输入对象(或数组)的每一个属性:- 如果属性值是一个对象或数组,则递归调用
undefinedToNull
方法继续处理其子属性,确保每一层都正确处理。 - 如果值是
undefined
,将该值替换为null
。 - 如果值是其他类型(如数字、字符串、布尔值等),直接将该值赋给结果。
- 如果属性值是一个对象或数组,则递归调用
最终,返回深度复制并处理过的对象或数组
res
。
复杂度分析
- 时间复杂度:
O(n)
,其中n
是对象或数组的元素总数,每个元素都会被访问一次并进行处理。 - 空间复杂度:
O(n)
,因为创建了一个新的副本对象或数组,空间需求与输入对象大小成正比。
代码
/**
* @param {Object|Array} obj
* @return {Object|Array}
*/
var undefinedToNull = function (obj) {
// 判断 obj 是数组还是对象,分别创建一个新的空数组或对象
let res = Array.isArray(obj) ? [] : {};
// 遍历 obj 的每个属性
for (let key in obj) {
// 如果当前属性值是对象或数组,递归调用 undefinedToNull 处理
if (typeof obj[key] === 'object') {
res[key] = undefinedToNull(obj[key]);
}
// 如果当前属性值是 undefined,替换为 null
else if (obj[key] == undefined) {
res[key] = null;
}
// 否则直接将原值赋给结果对象
else {
res[key] = obj[key];
}
}
// 返回新创建的对象或数组
return res;
};