算法题 Proxy

/** * 有如下对象data * 
 * 现需要将 data 转换为另一个数据结构 state * 
 * 且满足以下要求 * 
 * 1. state() == { a: { b: { c: 1 } } } * 
 * 2. state.a() == { b: { c: 1 } } * 
 * 3. state.a.b() == { c: 1 } * 
 * 4. state.a.b.c() == 1 * 
 * 5. state.a.b.d() == undefined * 
 * 6. state.a.e.f() == undefined * 
 * 7. state.g(4) == 4 */ 
// const data = { a: { b: { c: 1 } } };
// function transform(data) { 

// }

function transform(data) {
  function state (){
    return data;
  }
  state['g']=(val)=>val;
  const traverse = (obj, parent) => {
    Object.keys(obj).forEach(key => {
      const value = obj[key];
      parent[key] = () => value;
      // console.log('key',key,obj[key]);
      if (typeof value === 'object') {
        traverse(value, parent[key]);
      } 
    });
  };
  let handler = {
    get (target, key, receiver) {
      // 递归创建并返回
      if (typeof target[key] === 'function' && target[key] !== null) {
        return new Proxy(target[key], handler)
      }
      if(key in target){
        return Reflect.get(target, key, receiver)
      }else{
        target[key]=()=>undefined
        return new Proxy(target[key], handler)
      }
    },
    set (target, key, value, receiver) {
      return Reflect.set(target, key, value, receiver)
    }
  }
  let proxy = new Proxy(state, handler)
  traverse(data, proxy);
  return proxy;
}
const data = { a: { b: { c: { d : 1 } } } };
const test = transform(data);
console.log(test());
console.log(test.a());
console.log(test.a.b());
console.log(test.a.b.c());
console.log(test.g(4));
console.log(test.a.b.c.d());
console.log(test.a.t.f.f());
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值