【问题标题】:Access to object property with dynamic name and dynamic nesting level访问具有动态名称和动态嵌套级别的对象属性
【发布时间】:2017-03-04 16:49:46
【问题描述】:

我从字符串中读取了我想要访问的对象的属性: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。

提前谢谢你。

【问题讨论】:

  • 这闻起来像糟糕的设计。
  • 可能。它只是一个原型。

标签: javascript node.js javascript-objects


【解决方案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

【讨论】:

  • 完美。我使用 ['A.B.C.value'] 的版本使用了几分钟,因为它最适合我的用例。非常感谢!
【解决方案2】:

应该这样做:

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);

【讨论】:

  • 这对我来说也很棒。不幸的是,我只能将一种解决方案标记为已接受。不知道为什么。非常感谢。
猜你喜欢
  • 2011-10-25
  • 2010-12-20
  • 2010-12-13
  • 1970-01-01
  • 2022-11-17
相关资源
最近更新 更多