一种在不知道嵌套js对象中的路径的情况下访问属性的方法

时间:2018-06-06 22:50:21

标签: javascript object nested-properties

有没有办法在不知道路径的情况下访问对象中的嵌套属性? 例如,我可以有这样的东西

let test1 = {
  location: {
    state: {
     className: 'myCalss'
    }
 }
};

let test2 = {
  params: {
    className: 'myCalss'
  }
};

是否有“提取”className属性的简洁方法? 我有一个解决方案,但它非常难看,而且只考虑这两个案例,我想知道是否有更灵活的事情可以做

2 个答案:

答案 0 :(得分:3)

这是一种创建嵌套属性getter的优雅方法:

const getProperty = property => {
  const getter = o => {
    if (o && typeof o === 'object') {
      return Object.entries(o)
        .map(([key, value]) => key === property ? value : getter(value))
        .filter(Boolean)
        .shift()
    }
  }

  return getter
}

const test1 = {
  location: {
    state: {
      className: 'test1'
    }
  }
}

const test2 = {
  params: {
    className: 'test2'
  }
}

const test3 = {}

const getClassName = getProperty('className')

console.log(getClassName(test1))
console.log(getClassName(test2))
console.log(getClassName(test3))

如果你想防止循环对象导致堆栈溢出,我建议使用WeakSet来跟踪迭代对象引用:

const getProperty = property => {
  const getter = (o, ws = new WeakSet()) => {
    if (o && typeof o === 'object' && !ws.has(o)) {
      ws.add(o)
      return Object.entries(o)
        .map(([key, value]) => key === property ? value : getter(value, ws))
        .filter(Boolean)
        .shift()
    }
  }

  return getter
}

const test1 = {
  location: {
    state: {
      className: 'test1'
    }
  }
}

const test2 = {
  params: {
    className: 'test2'
  }
}

const test3 = {}
const test4 = {
  a: {
    b: {}
  }
}

test4.a.self = test4
test4.a.b.self = test4
test4.a.b.className = 'test4'

const getClassName = getProperty('className')

console.log(getClassName(test1))
console.log(getClassName(test2))
console.log(getClassName(test3))
console.log(getClassName(test4))

答案 1 :(得分:1)

不确定。试一试。它递归迭代对象并返回第一个匹配。您可以根据需要配置DOSSEG .MODEL SMALL .STACK 200H .DATA STRING DB 'cScbd$' STRING_LENGTH EQU $-STRING STRING1 DB STRING_LENGTH DUP (?) , '$' .CODE MOV AX,@DATA MOV DS,AX XOR SI,SI XOR DI,DI MOV CX,STRING_LENGTH S: MOV BL,STRING[DI] AND STRING[DI],01111100B CMP STRING[DI],01100000B JNE L1 MOV AL,BL MOV STRING1[SI],AL ADD SI,2 L1: ADD DI,2 LOOP S MOV DL,STRING1 MOV AH,9 INT 21H MOV AH,4CH INT 21H END 循环以匹配全部或最后一个



for