实现lodash.get方法

lodash.get 参考 lodash中文文档

get功能如下示例

var object = { 'a': [{ 'b': { 'c': 3 } }] };
 
get(object, 'a[0].b.c');
// => 3
 
get(object, ['a', '0', 'b', 'c']);
// => 3
 
get(object, 'a.b.c', 'default');
// => 'default'

可以看到,不管是使用下标[0]方法还是使用连续字符串['a', '0', 'b', 'c'],get都能正确返回结果

解析:这里可以预先处理,先把所有输入的 path路径,统一转成 ['a', '0', 'b', 'c'] 形式的数组,然后再迭代取值,

get实现如下:

/**
* object: 对象
* path: 输入的路径
* defaultVal: 默认值
**/

function get(object, path, defaultVal='undefined') {
    // 先将path处理成统一格式
    let newPath = [];
    if (Array.isArray(path)) {
        newPath = path;
    } else {
        // 先将字符串中的'['、']'去除替换为'.',split分割成数组形式
        newPath = path.replace(/\[/g,'.').replace(/\]/g,'').split('.');
    }

    // 递归处理,返回最后结果
    return newPath.reduce((o, k) => {
        console.log(o, k); // 此处o初始值为下边传入的 object,后续值为每次取的内部值
        return (o || {})[k]
    }, object) || defaultVal;   
}

调用结果:

值得注意的是 reduce的用法

参考:JavaScript reduce() 方法

reduce接收两个参数,

第一个是回调函数,这个函数接收四个参数:初始值/计算结束的返回值(必选),当前元素(必选),当前元素索引值(可选), 当前元素所属数组对象(可选)

第二个是 传递给函数的初始值(可选),

关于reduce等迭代用法可参考 数组遍历forEach、map、filter、find、some、every、reduce等区别

  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 你可以使用 JavaScript 的内置函数 `Object.prototype.hasOwnProperty()` 和 `Object.prototype.getOwnPropertyDescriptor()` 来实现类似 lodash 中的 `_.get()` 功能。 具体来说,你可以写一个函数,它接受两个参数:对象和路径。函数首先检查路径中的每一个属性是否存在于对象中,如果存在就继续往下查找,否则返回 `undefined`。 下面是一个示例实现: ``` function get(obj, path) { // 将路径拆分成数组 const pathArr = path.split('.'); // 遍历路径数组 for (const key of pathArr) { // 如果属性不存在或者对象不是一个普通对象,则返回 undefined if (!obj || typeof obj !== 'object') { return undefined; } // 如果属性存在,则将对象更新为该属性的值 if (obj.hasOwnProperty(key)) { obj = obj[key]; } else { return undefined; } } // 返回最终的值 return obj; } ``` 你也可以使用 JavaScript 的内置方法 `Object.prototype.getOwnPropertyDescriptor()` 来获取属性的描述符,并判断它是否是一个 getter。如果是,则调用 getter 函数来获取属性值。 下面是使用 `Object.prototype.getOwnPropertyDescriptor()` 的示例实现: ``` function get(obj, path) { // 将路径拆分成数组 const pathArr = path.split('.'); // 遍历路径数组 for (const key of pathArr) { // ### 回答2: 要实现类似 lodash 中的 _.get() 功能,我们可以使用 JavaScript 编程来实现。 _.get() 的功能是根据给定的路径从对象中获取对应的值。下面是一个实现该功能的函数: ``` function get(object, path, defaultValue) { // 检查传入的参数是否合法 if (object == null || typeof object !== 'object' || Array.isArray(object)) { return defaultValue; } const keys = path.split('.'); // 将路径拆分成数组 // 遍历路径数组,逐级获取对象中的值 let result = object; for (const key of keys) { result = result[key]; if (result == null) { return defaultValue; // 如果某一级的值不存在,则返回默认值 } } return result; } ``` 使用方法示例: ```js const obj = { a: { b: { c: 123, }, }, }; console.log(get(obj, 'a.b.c')); // 输出:123 console.log(get(obj, 'x.y.z', 'default value')); // 输出:default value,因为路径 x.y.z 在对象中不存在 ``` 上述代码定义了一个名为 `get` 的函数,它接收三个参数:`object` 表示要获取值的对象,`path` 表示要获取的值的路径,`defaultValue` 表示如果路径不存在时返回的默认值。 函数首先检查参数的合法性,然后将路径拆分成数组。接下来,通过一个循环遍历路径数组,逐级获取对象中的值。如果某一级的值不存在,则返回默认值。 这样,我们就实现了一个类似 lodash 中的 _.get() 功能的函数。 ### 回答3: lodash 中的 _.get() 功能是获取对象中指定路径的属性值,如果属性值不存在,可以设置一个默认值。为了实现类似的功能,我们可以采用递归的方式来遍历对象的属性路径,然后返回对应的属性值。 具体实现步骤如下: 1. 首先,我们需要传入两个参数,一个是对象,另一个是属性路径。属性路径可以是一个字符串,也可以是一个数组。 2. 在函数中,我们先判断属性路径是否为字符串,如果是,就把它转换成数组的形式,方便后面处理。 3. 我们定义一个辅助函数来实现递归的方式,传入两个参数,一个是对象,一个是属性路径数组。 4. 在辅助函数中,我们首先判断属性路径是否为空,如果是,就返回当前对象。 5. 然后,我们取出属性路径数组的第一个元素,并从对象中获取对应的属性值。 6. 如果属性值不存在,我们可以设置一个默认值,如果没有传入默认值,就返回 undefined。 7. 如果属性路径数组还有元素,我们递归调用辅助函数,传入对象和剩余的属性路径数组。 8. 最后,我们返回获取的属性值。 这样就实现了类似 lodash 中的 _.get() 功能,可以方便地获取对象中指定路径的属性值。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端卡卡西呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值