面试总结 - 基础编程题 - 实现一个取obj值的方法1.js

小记一波百度面试基础编程题。要求手写,回来害怕错误,专门又写了一遍。由于正则容易出错,手写时用的字符串截取的方式来实现的。见笑了~~ 捂脸

// 已知 obj = {
  a: {
    b: {
      c: {
        d: {
          e: 5
        }
      }
    }
  }
}
实现一个方法 getValue(obj, 'a.b.c.d') 取到 obj.a.b.c.d 的值

实现方式

1. 正则匹配法
function getValue(obj, path) {
  if (typeof path !== 'string') throw new Error(`参数传入类型错误`);

  const reg = /^(\w+)((\.\w+)*)$/;
  const matchResult = reg.exec(path);
  // debugger;
  if (!matchResult) {
    return obj;
  }
  const prefix = matchResult[1];
  const lastFix = (matchResult[2] || '.').substr(1);

  if (obj[prefix]) {
    return getValue2(obj[prefix], lastFix)
  } else {
    throw new Error(`取值不正确`);
  }
}

2. 字符串截取法

function getValue(obj, path) {
  if (typeof path !== 'string') throw new Error(`参数传入类型错误`);
  
  const splitFlag = path.indexOf('.');
  if (splitFlag < 0) return obj[path];
  
  const prefix = path.substring(0, splitFlag);
  const lastFix = path.substring(splitFlag + 1);
  // debugger;
  if (!lastFix) return obj;
  if (obj[prefix]) {
    return getValue(obj[prefix], lastFix);
  } else {
    throw new Error(`取值不正确`);
  }
}

3. 遍历key值法

楼下大佬提供了一种思路,本人才浅。之前没想到,特做一下笔记

function getValue(obj, keys) {
	if (typeof keys !== 'string') throw new Error(`参数传入类型错误`);
	keys = keys.split('\.');
	for(let i = 0; i < keys.length; i++) {
		if (obj[keys[i]] !== undefined) {
			obj = obj[keys[i]];
		} else {
			throw new Error('传入取值路径有误');
		}
	}
	return obj;
}

自测

const obj = {
  a: {
    b: {
      c: {
        d: {
          e: 5
        }
      }
    }
  }
}
const v1 = getValue(obj, 'a.b.c.d');  // {e: 5}
const v2 = getValue(obj, 1);		  // error `参数传入类型错误`
const e1 = getValue(obj, 'a.s.x.t');  // error `取值不正确`
const v3 = getValue(obj, 'a');        // {b: { ... }}

才浅学疏,若您有什么优秀的方式,please tell me。


愿娘子相离之后重梳婵鬓,美扫蛾眉;巧呈窈窕之姿,选聘高官之主;解怨释结,更莫相憎;一别两宽,各生欢喜。 一一 唐朝《放妻书》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值