如何枚举复杂的javascript对象

时间:2018-03-06 07:22:46

标签: javascript lodash

如何枚举复杂的javascript对象以获取普通值的属性路径?

例如,如果对象是:

let complex = {
  person: {name: 'mat', age: 31},
  car: {
      model: 'Volsan',
      engine: 'large', 
      doors:[
        { side:'right front', color: 'blue' },
        { side:'left rear', color: 'red' }
      ]
   }
};

结果如下:

complex.person.name
complex.person.age
complex.car.model
complex.car.engine
complex.car.doors[0].side
complex.car.doors[0].color
complex.car.doors[1].side
complex.car.doors[1].color

这样只有那些“结束图”的值

例如。它将是来自lodash的反向_.at:https://lodash.com/docs/4.17.5#at

1 个答案:

答案 0 :(得分:0)

此递归解决方案使用Array.map()Object.keys()将密钥添加到基本路径。然后,我们使用Array.concat()spread

展平生成的数组



const complex = {
  person: {name: 'mat', age: 31},
  car: {
      model: 'Volsan',
      engine: 'large', 
      doors:[
        { side:'right front', color: 'blue' },
        { side:'left rear', color: 'red' }
      ]
   }
}

const addDot = (b, s) => `${b}${b && '.'}${s}`
const wrapBrackets = (b, s) => `${b}[${s}]`

const mapPaths = (obj, base = '') => {
  if(typeof obj !== 'object') {
    return base;
  }

  const formatter = Array.isArray(obj) ? wrapBrackets : addDot;

  return [].concat(...Object.keys(obj)
    .map((key) => mapPaths(obj[key], formatter(base, key))))
};

const result = mapPaths(complex)

console.log(result);