使用 JavaScript 动态访问嵌套对象值
access nested object values dynamically using JavaScript
假设我有一个对象:
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 = (object, keys) => keys.reduce((o, k) => (o || {})[k], object),
object = { a: 'a', b: 'b', c: { x: 'c', y: 'd' } },
keys = ['a', 'b', 'c.x'],
result = keys.map(s => getValue(object, s.split('.')));
console.log(result);
注意:以下解决方案适用于给定的场景,其中对象属性使用点表示法表示,但如果使用方括号表示法(例如 c[x]
)将失败。
const abc = {
a: 'aVal',
b: 'bVal',
c: {
x: 'cxVal',
y: 'cyVal'
},
d: {
x: 'dxVal',
y: {
z: 'dyzVal',
w: 'dywVal'
}
}
};
const arr = ['a', 'b', 'c.x', 'd.y.w'];
function getValues(obj, keysArr) {
return keysArr.map(key => {
return key.split('.').reduce((acc, item) => {
return acc[item];
}, obj);
});
}
const values = getValues(abc, arr);
console.log(values);
假设我有一个对象:
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 = (object, keys) => keys.reduce((o, k) => (o || {})[k], object),
object = { a: 'a', b: 'b', c: { x: 'c', y: 'd' } },
keys = ['a', 'b', 'c.x'],
result = keys.map(s => getValue(object, s.split('.')));
console.log(result);
注意:以下解决方案适用于给定的场景,其中对象属性使用点表示法表示,但如果使用方括号表示法(例如 c[x]
)将失败。
const abc = {
a: 'aVal',
b: 'bVal',
c: {
x: 'cxVal',
y: 'cyVal'
},
d: {
x: 'dxVal',
y: {
z: 'dyzVal',
w: 'dywVal'
}
}
};
const arr = ['a', 'b', 'c.x', 'd.y.w'];
function getValues(obj, keysArr) {
return keysArr.map(key => {
return key.split('.').reduce((acc, item) => {
return acc[item];
}, obj);
});
}
const values = getValues(abc, arr);
console.log(values);