2017-10-28 45 views
2

获取价值存在多层次一个JavaScript对象,如:如何使用按键阵列从一个Javascript对象

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

我想编写一个函数,它传递对象和一组键。该函数应该返回一个基于这些键的值。例如,传递[obj11,B]应返回13.传递[obj11,obj1111,A]应返回15.传obj21应该返回对象{A:15,B:16}

function (myObj,myArr) { 

     return keyVal; 
    } 

假设键永远是正确的,谁能帮我解决这个问题?

+0

选择器的格式是否重要? 'obj11.b'会起作用吗? – Keith

回答

3

你可以减少与键阵列,并采取一个对象作为默认值。

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; }

+0

令人惊叹!谢谢。我需要看看减少。你可以节省一些时间,还有一个setValue函数。 – Sam

+0

它只是取反对象的相反功能,如果没有设置则建立一个对象,最后赋值。 –

+0

我试过但我无法得到它。函数的第三个参数是要分配的新值。我认为这与这个功能并不完全相反。 – Sam

3

您可以使用reduce()单线程完成此操作。当然,如果你想把它包装在一个函数中,你也可以这样做。

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)

+0

'['obj11','obj1111','b','a','a']'会抛出错误,返回undefined可能更好。 – Keith

+0

是的 - 我完全同意@Keith –

+0

@Mark_M请看看你是否可以帮助我[this one](https://stackoverflow.com/questions/46994662/how-to-set-value-to-a-property-在-A-JavaScript的对象,其-被鉴定的逐一个)。听起来简单,当我读到减少,但我卡住了。 – Sam

0

递增的讨论,如果你使用lodash你也可以使用该功能_.get得到这样的价值:

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

如果您反对具有数组值的属性,您还可以通过索引获得

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

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

来源:https://lodash.com/docs/4.17.4#get