使用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
。您可以在这里找到更多资源:,