使用对象名称和属性名称的数组获取对象 属性

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 以获得更复杂的解决方案(如果您愿意将其包含在您的项目中)。