Si hay un objeto Javascript con múltiples niveles, como en:

myObject = {
        a: 12,
        obj11: {
                obj111: 'John',
                b:13,
                obj1111: { a:15, b: 35 } 
        },
        obj21: { 
                a:15,
                b:16 }
        }

Quiero escribir una función a la que se le pasa el objeto y una matriz de claves. La función debería devolver un valor basado en estas teclas. Por ejemplo, pasar [obj11, b] debería devolver 13. Pasar [obj11, obj1111, a] debería devolver 15. Pasar obj21 debería devolver el objeto {a: 15, b: 16}

  function (myObj,myArr) {

      return keyVal;
  }

Suponiendo que las claves son siempre correctas, ¿alguien puede ayudarme a resolver este problema?

2
Sunny 28 oct. 2017 a las 23:19

3 respuestas

La mejor respuesta

Puede reducir la matriz con las teclas y tomar un objeto como valor predeterminado.

function getValue(object, path) {
    return path.reduce(function (r, k) {
        return (r || {})[k];
    }, object);
}

var object = { a: 12, obj11: { obj111: 'John', b: 13, obj1111: { a: 15, b: 35 }, obj21: { a: 15, b: 16 } } };

console.log(getValue(object, ['obj11', 'b']));
console.log(getValue(object, ['obj11', 'obj1111', 'a']));
console.log(getValue(object, ['obj11', 'obj21']));
.as-console-wrapper { max-height: 100% !important; top: 0; }
3
Nina Scholz 28 oct. 2017 a las 20:27

Puede hacer esto con una línea reduce(). Por supuesto, si desea incluirlo en una función, también puede hacerlo.

var myObject = {
    a: 12,
   obj11: {
           obj111: 'John',
           b:13,
           obj1111: { a:15,
                      b: 35 }
           },
   obj21: {
           a:15,
           b:16 }
}

var arr =   ['obj11','b']
var val = arr.reduce((acc,curr) => acc[curr], myObject)
console.log(val)

var arr =   ['obj11','obj1111', 'b']
var val = arr.reduce((acc,curr) => acc[curr], myObject)
console.log(val)
3
Mark Meyer 28 oct. 2017 a las 20:26

Para aumentar la discusión, si está usando lodash, también puede usar la función _.get para obtener el valor de esta manera:

_.get(myObject, ['obj111', 'obj1111'])
//returns 'John'

Si su objeto tiene propiedades con valores de matriz, también puede obtener por índices

var obj = {
        a: 1,
        b:[{
           d:4,
           c:8
        }]

_.get(obj, ['b','0','d'])
//returns 4

Fuente: https://lodash.com/docs/4.17.4#get

0
tiagolisalves 28 oct. 2017 a las 21:05