使用JavaScript动态访问嵌套对象值

使用JavaScript动态访问嵌套对象值,javascript,ecmascript-6,nested-loops,Javascript,Ecmascript 6,Nested Loops,假设我有一个对象: var abc = { a: 'a', b: 'b', c: { x: 'c', y: 'd' } } 现在我想根据下面数组中的值动态获取对象值 var arr = ['a', 'b', 'c.x'] 您可以创建如下扩展: Object.defineProperty(Object.prototype, 'valueAt', { value: function (location, defaultValue) {

假设我有一个对象:

var abc = {
    a: 'a',
    b: 'b',
    c: {
      x: 'c',
      y: 'd'
    }
}
现在我想根据下面数组中的值动态获取对象值

var arr = ['a', 'b', 'c.x'] 

您可以创建如下扩展:

Object.defineProperty(Object.prototype, 'valueAt', {
  value: function (location, defaultValue) {
    const routes = location.split('.');
    const lastRoute = routes.pop();

    let value = routes.reduce(
      (current, route) => current && current[route],
      this
    );

    if (value) return value[lastRoute] || defaultValue;
    else return defaultValue;
  },
  writable: true,
  configurable: true,
  enumerable: false,
});
然后使用:

abc.valueAt("c.x");

您可以拆分字符串以获得数组,并通过访问对象来减少键

var getValue=(对象,键)=>keys.reduce((o,k)=>(o |{})[k],对象),
object={a:a',b:b',c:{x:c',y:d'},
键=['a','b','c.x'],
结果=keys.map(s=>getValue(对象,s.split('.'));

控制台日志(结果)注意:以下解决方案适用于给定场景,其中使用点符号表示对象属性,但如果使用括号符号(例如
c[x]
),则将失败

const abc={
a:‘阿瓦尔’,
b:‘bVal’,
c:{
x:‘cxVal’,
y:‘西瓦尔’
},
d:{
x:‘dxVal’,
y:{
z:‘戴兹瓦尔’,
w:‘dywVal’
}
}
};
常数arr=['a','b','c.x','d.y.w'];
函数getValues(obj、keysArr){
返回keysArr.map(key=>{
返回键。拆分('.')。减少((附件,项目)=>{
返回acc[项目];
},obj);
});
}
常量值=获取值(abc、arr);

console.log(值)谢谢你的回答。。有点困惑,为什么acc对象在迭代时完全变为嵌套属性的值。
acc
只是一个占位符,用obj初始化;在每次迭代中,我们深入到对象中,直到达到预期的属性。让我们考虑<代码> D.Y.W.案例:在第一次迭代<代码> ACC 是整个<代码> ABC < /代码>对象,我们返回代码> ABC[D] < /代码>;在第二次迭代中,
acc
已成为
abc
对象的
d
属性,我们返回
d[y]
;在第三次迭代时,
acc
已成为
d
对象的
y
属性,我们返回
y[w]
,[…继续…],因为这是最后一次迭代,
reduce()返回的最终值
正是我们想要的:
abc
对象的
w
属性
y
属性
d
属性。。。也就是说,
abc.d.y.w
。您可以在这里找到更多资源:,