以下为ChatGPT自动生成的解答,正确与否请自行判断。 也许你也可以从大家的发帖中找到想要的答案!
BFE.devAI解答 - JavaScript 代码题
85. 实现 `_.get()`
实现 get()
的思路:
- 先将第二个参数转成数组格式,数组里面的元素就是要获取的属性名或者下标值。
- 再遍历数组,通过
obj[curr]
的方式依次访问对象或者数组中的属性值(当然要加一些判断)。 - 如果最终取到的值为 undefined,则返回第三个参数。
根据以上思路,可以写出以下代码实现 get()
:
function get(obj, path, defaultValue) { // 将路径参数转成数组格式 const fields = Array.isArray(path) ? path : path.split(/[.[\]]+/g).filter(Boolean); // 遍历每一个属性名或下标值 for (let i = 0; i < fields.length; i++) { // 当前属性名或下标值 const curr = fields[i]; // 如果当前值不是对象,则无法获取子属性,直接返回默认值 if (!obj || typeof obj !== 'object') { return defaultValue; } // 如果当前值是数组,则获取数组中指定下标的元素 if (Array.isArray(obj) && /^\d+$/.test(curr)) { obj = obj[parseInt(curr)]; } // 否则,获取对象中的指定属性值 else { obj = obj[curr]; } } // 如果获取到的值为 undefined,则返回默认值 return obj === undefined ? defaultValue : obj;}const obj = { a: { b: { c: [1,2,3] } }}console.log(get(obj, 'a.b.c')); // [1,2,3]console.log(get(obj, 'a.b.c.0')); // 1console.log(get(obj, 'a.b.c[1]')); // 2console.log(get(obj, ['a', 'b', 'c', '2'])); // 3console.log(get(obj, 'a.b.c[3]')); // undefinedconsole.log(get(obj, 'a.c', 'bfe')); // 'bfe'
输出结果与预期一致,说明 get()
方法实现成功。