获取嵌套对象中访问值的路径

时间:2017-09-01 17:59:26

标签: javascript proxy handler getter-setter

我想获取嵌套对象中值的路径。但我的实验并没有像我预期的那样奏效。 scope应该将路径(键数组)返回到嵌套对象的公开值,但我不知道如何实现它。

它应该像观察者一样返回访问的路径。

以下是我的实施。

function wrap(o, fn, scope = []) {
  const handler = {
    set(target, prop, value, receiver) {
      fn('set value in scope: ', scope.concat(prop))
      target[prop] = value
      return true
    },
    get(target, prop, receiver) {
      fn('get value in scope: ', scope.concat(prop))
      return o[prop]
    },
    ownKeys() {
      fn('keys in scope: ', scope)
      return Reflect.ownKeys(o)
    }
  }

  return new Proxy(
    Object.keys(o).reduce((result, key) => {
      if (isObject(result[key])) {
        result[key] = wrap(o[key], fn, scope.concat(key))
      } else {
        result[key] = o[key]
      }
      return result
    }, {}),
    handler
  )
}

function isObject(obj) {
  return typeof obj === 'object' && !Array.isArray(obj)
}

const obj = wrap({
  a0: {
    a1: {
      a2: 0
    },
    b1: {
      b2: 0
    }
  },
  b0: 0
}, console.log)


// set value:
obj.b0 = 1

// get value:
console.log('value: ' + obj.a0.a1.a2)

// list keys:
console.log('keys: ', Object.keys(obj.a0))

  • 第一个日志应返回set value in scope: ['b0']
  • 第二个应该返回get value in scope: ['a0', 'a1', 'a2']value: 0
  • 最后一个应该返回keys in scope: ['a0']obj.a0
  • 的键

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

你犯了一些错误:

get(target, prop, receiver) {
    fn('get value in scope: ', scope.concat(prop))
    return o[prop]
},

返回包装版本是return target[prop]。 和

if (isObject(result[key])) {
    result[key] = wrap(o[key], fn, scope.concat(
} else {
    result[key] = o[key]
}

检查原始对象<{1}}

如果没有触及任何其他内容,您的第二个日志将更像:

isObject(o[key])