使用对象名称和属性名称的数组获取对象 属性
Get object property using array of object name and proerty name
我想从映射到 属性 位置的数组中动态查找对象 属性。
示例
Var objectA = { a:{b:1} };
Var Names = ['objectA','a','b'];
如何通过遍历数组名称来获取 b
的值?
要在不使用 eval 的情况下执行此操作,需要将 ObjectA
存储为另一个对象的 属性,您可以使用数组键对其进行迭代。 eval
将在这种情况下起作用:
objectA = { a: { b: 1 }}
names = ['objectA', 'a', 'b']
alert(eval(names.join('.')))
您可以使用评估: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
}
*/
假设 objectA
在全局范围内可用 (window.objectA
),您可以这样做:
names.reduce(function (memo, value) {
return memo[value];
}, window)
对于任何其他 "non-global" 变量,您可以创建一个 getter 函数来获取变量和路径(数组就像您的 names
,但没有第一个值)作为参数:
function nestedValue(obj, path) {
return path.reduce(function (memo, value) {
return memo[value];
}, obj);
}
顺便说一句,请注意 Array.prototype.reduce()
是 ES2015 的一项功能,因此如果您需要与旧版浏览器兼容,则必须使用 for
循环的一些变体来完成此任务。
您还可以查看 lodash.get 以获得更复杂的解决方案(如果您愿意将其包含在您的项目中)。
我想从映射到 属性 位置的数组中动态查找对象 属性。
示例
Var objectA = { a:{b:1} };
Var Names = ['objectA','a','b'];
如何通过遍历数组名称来获取 b
的值?
要在不使用 eval 的情况下执行此操作,需要将 ObjectA
存储为另一个对象的 属性,您可以使用数组键对其进行迭代。 eval
将在这种情况下起作用:
objectA = { a: { b: 1 }}
names = ['objectA', 'a', 'b']
alert(eval(names.join('.')))
您可以使用评估: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
}
*/
假设 objectA
在全局范围内可用 (window.objectA
),您可以这样做:
names.reduce(function (memo, value) {
return memo[value];
}, window)
对于任何其他 "non-global" 变量,您可以创建一个 getter 函数来获取变量和路径(数组就像您的 names
,但没有第一个值)作为参数:
function nestedValue(obj, path) {
return path.reduce(function (memo, value) {
return memo[value];
}, obj);
}
顺便说一句,请注意 Array.prototype.reduce()
是 ES2015 的一项功能,因此如果您需要与旧版浏览器兼容,则必须使用 for
循环的一些变体来完成此任务。
您还可以查看 lodash.get 以获得更复杂的解决方案(如果您愿意将其包含在您的项目中)。