以下为ChatGPT自动生成的解答,正确与否请自行判断。
BFE.devAI解答 - JavaScript 代码题
156. 请实现`_.set()`
实现思路:
首先要对传入的属性路径进行解析,然后根据解析的路径去找到对应的位置,将对应位置的值赋为传入的值即可。
具体实现:
function set(obj, path, value) {
// 将属性路径都转化成数组形式,方便遍历和操作
const parts = Array.isArray(path) ? path : path.split('.');
let target = obj;
let prevTarget = null;
// 循环遍历 属性路径数组中的每一项,找到最后一项的前一项,以及最后一项
for (let i = 0; i < parts.length; i++) {
const key = parts[i];
// 如果数字属性,则说明应该取出数组中的对应元素
if (/^\d+$/.test(key)) {
prevTarget = target;
target = target[key] || (target[key] = []);
} else {
prevTarget = target;
target = target[key] || (target[key] = {});
}
}
// 对最后一个属性进行赋值
prevTarget[parts[parts.length - 1]] = value;
}
代码中有详细的注释,主要思路就是循环遍历给定的属性路径数组,找到最后一个属性名的前一个位置,最后对最后一个属性进行赋值。同时,在处理数字类型的属性名称时,需要进行特殊的处理,即将它看作是数组下标。