推荐答案
// www.javascriptcn.com code example
function set(obj, path, value) {
if (!obj || typeof obj !== 'object') {
throw new TypeError('Expected an object as the first argument');
}
const keys = Array.isArray(path) ? path : path.split('.');
let current = obj;
for (let i = 0; i < keys.length - 1; i++) {
const key = keys[i];
if (!current[key] || typeof current[key] !== 'object') {
current[key] = {};
}
current = current[key];
}
current[keys[keys.length - 1]] = value;
return obj;
}本题详细解读
1. 函数功能
set 函数的作用是根据给定的路径 path,在对象 obj 中设置属性值 value。路径可以是字符串(如 'a.b.c')或数组(如 ['a', 'b', 'c'])。
2. 参数说明
obj: 目标对象,必须是一个对象。path: 路径,可以是字符串或数组。value: 要设置的值。
3. 实现思路
- 参数校验:首先检查
obj是否为对象,如果不是则抛出类型错误。 - 路径解析:将路径
path转换为数组形式,方便后续处理。 - 遍历路径:遍历路径数组,逐层深入对象,如果某一层不存在或不是对象,则创建一个空对象。
- 设置值:在最后一层设置指定的值。
4. 代码解析
if (!obj || typeof obj !== 'object'):检查obj是否为对象。const keys = Array.isArray(path) ? path : path.split('.'):将路径转换为数组形式。for (let i = 0; i < keys.length - 1; i++):遍历路径数组,逐层深入对象。current[keys[keys.length - 1]] = value:在最后一层设置指定的值。
5. 示例
const obj = { a: { b: { c: 1 } } };
set(obj, 'a.b.c', 2);
console.log(obj); // { a: { b: { c: 2 } } }
set(obj, ['a', 'b', 'd'], 3);
console.log(obj); // { a: { b: { c: 2, d: 3 } } }6. 注意事项
- 如果路径中的某一层不是对象,函数会将其覆盖为一个空对象。
- 路径中的空字符串或无效键可能会导致意外行为,需确保路径正确。