使用动态名称和动态嵌套级别访问对象属性

时间:2017-03-04 16:49:46

标签: javascript node.js javascript-objects

我从字符串中读取了我想要访问的对象的属性:level1.level2.property OR level1.property OR ...名称和嵌套可能会有所不同。我将对象存储在一个单独的模块中(workerFunctions)。

我知道我可以使用[]表示法动态访问对象,例如:

var level1="level1";
var property="property";    
console.log(workerFunctions[level1][property])

但是,我不知道如何构建这个" workerFunctions [level1] [property]"动态地来自不同的输入字符串,因此产生例如:

console.log(workerFunctions[level1][level2][property])

由于字符串:level1.level2.property。

提前谢谢。

2 个答案:

答案 0 :(得分:1)

这应该这样做:



const str = 'level1.level2.property';
let value = { //workerFunctions;
  level1: {
    level2: {
      property: 'this is the value'
    }
  }
};
str.split(/\./).forEach((prop) => {
  value = value[prop];
});
console.log(value);




答案 1 :(得分:1)

您可以拆分路径并将部件用作给定对象的属性。



function getValue(o, path) {
    return path.split('.').reduce(function (o, k) {
        return (o || {})[k];
    }, o);
}

var o = { A : { B: { C: { value: 'Brenda' } } } };

console.log(getValue(o, 'A.B.C').value); // Brenda
console.log(getValue(o, 'Z.Y.X'));       // undefined




为了更好地使用属性中的点,您可以直接使用数组以避免错误分割。



function getValue(o, path) {
    return path.reduce(function (o, k) {
        return (o || {})[k];
    }, o);
}

var o = { A : { 'B.C': { value: 'Brenda' } } };

console.log(getValue(o, ['A', 'B.C', 'value'])); // Brenda
console.log(getValue(o, ['Z.Y.X']));             // undefined