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

时间:2016-08-30 16:42:51

标签: javascript javascript-objects

我想从映射到属性位置的数组中动态查找对象属性。

示例

 Var objectA = { a:{b:1} };
 Var Names = ['objectA','a','b'];

如何通过循环数组名称获得b的值?

3 个答案:

答案 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会在这种情况下起作用:

&#13;
&#13;
objectA = { a: { b: 1 }}
names = ['objectA', 'a', 'b']
alert(eval(names.join('.')))
&#13;
&#13;
&#13;