跳至主要內容

2775. 将 undefined 转为 null 🔒


2775. 将 undefined 转为 null 🔒

🟠   🔗 力扣open in new window LeetCodeopen in new window

题目

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 array
  • 2 <= 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

解题思路

  1. 通过判断输入是数组还是对象,分别创建一个新的空数组或对象(res),以便存储最终的结果。因为需要深度复制原对象或数组,保证不修改原对象。

  2. 使用 for...in 循环遍历输入对象(或数组)的每一个属性:

    • 如果属性值是一个对象或数组,则递归调用 undefinedToNull 方法继续处理其子属性,确保每一层都正确处理。
    • 如果值是 undefined,将该值替换为 null
    • 如果值是其他类型(如数字、字符串、布尔值等),直接将该值赋给结果。
  3. 最终,返回深度复制并处理过的对象或数组 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;
};