我想从映射到属性位置的数组中动态查找对象属性。
示例
Var objectA = { a:{b:1} };
Var Names = ['objectA','a','b'];
如何通过循环数组名称获得b
的值?
答案 0 :(得分:2)
假设objectA
在全局范围(window.objectA
)中可用,您可以执行以下操作:
names.reduce(function (memo, value) {
return memo[value];
}, window)
对于任何其他“非全局”变量,您可以创建一个getter函数,该函数将变量和路径(一个数组与names
一样,但没有第一个值)作为参数:
function nestedValue(obj, path) {
return path.reduce(function (memo, value) {
return memo[value];
}, obj);
}
BTW,请注意Array.prototype.reduce()
是ES2015的功能,因此如果您需要与旧版浏览器兼容,则必须使用for
循环的某些变体来执行此任务。
您还可以查看lodash.get以获得更复杂的解决方案(如果您愿意将其包含在项目中)。
答案 1 :(得分:1)
您可以使用eval:eval(Names.join('.'))
可以在沙盒中使用nodejs
:
const util = require('util');
const vm = require('vm');
const objectA = { a: { b: 1 }};
const Names = ['objectA', 'a', 'b'];
const sandbox = { objectA: objectA, Names: Names };
vm.createContext(sandbox);
for (var i = 0; i < 10; ++i) {
vm.runInContext("var result = eval(Names.join('.'))", sandbox);
}
console.log(util.inspect(sandbox));
/* {
objectA: { a: { b: 1 } },
Names: [ 'objectA', 'a', 'b' ],
result: 1
}
*/
答案 2 :(得分:0)
要在没有eval的情况下执行此操作,您需要将ObjectA
存储为另一个可以使用数组键迭代的对象的属性。 eval
会在这种情况下起作用:
objectA = { a: { b: 1 }}
names = ['objectA', 'a', 'b']
alert(eval(names.join('.')))
&#13;