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

Get the path to the accessed value in a nested object

我想获取嵌套对象中值的路径。但是我的实验并没有像我预期的那样进行。 scope 应该 return 从嵌套对象到公开值的路径(键数组),但我不知道如何实现。

它应该像 return 访问路径的观察者一样工作。

下面是我的实现。

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))

感谢您的帮助!

你犯了一些错误:

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

它是 return target[prop] 到 return 包装版本。 和

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

isObject(o[key])检查原始对象

并且在不触及任何其他内容的情况下,您的第二个日志看起来更像:

get value in scope: ['a0'] 
get value in scope: ['a0', 'a1'] 
get value in scope: ['a0', 'a1', 'a2'] 
value: 0